Skip to content

Instantly share code, notes, and snippets.

View x-labz's full-sized avatar
🤩
playing hard

x-labz x-labz

🤩
playing hard
View GitHub Profile
@x-labz
x-labz / example#1.js
Last active September 10, 2020 14:03
redux-saga race conditions - example #1
yield select ( getMessages ) ;
yield put ( action1() ) ;
yield call ( preprocess ) ;
yield call ( fetchDataFromBackend ) ; // <-- async! task will wait for backend response
yield put ( action2() ) ;
@x-labz
x-labz / reducer.js
Last active September 10, 2020 14:03
redux-saga race conditions - reducer
const initialState = {
data: 0,
counter: 0
};
const reducer = (state = initialState, action) => {
switch (action.type) {
case "UPDATE": {
return { ...state, data: action.payload };
}
@x-labz
x-labz / tasks.js
Last active September 10, 2020 14:01
redux-saga race conditions - tasks
function* task1() {
logger("task1 started");
const step0 = yield select(getData);
logger(`task1-step0 - ${step0} (expected:0,0)`);
const step1 = yield select(getData);
logger(`task1-step1 - ${step1} (expected:0,0)`);
yield put(updateAction(2));
logger("task1 update dispatched (2)");
@x-labz
x-labz / log.txt
Created September 10, 2020 14:04
redux-saga race conditions - log
task1 started
task1-step0 - data:0,counter:0 (expected:0,0)
task1-step1 - data:0,counter:0 (expected:0,0)
task2 started
task2-step0 - data:0,counter:0 (expected:0,0)
task1 update dispatched (2)
task2 update dispatched (-1)
task2-step1 - data:-1,counter:0 (expected:-1,0)
task2 ended
task1 increment dispatched
const collectUserEvent = (state = initialState, action, wholeState) => {
const { payload: { userEvent } } = action;
cosnst sessionID = wholeState.users[userEvent.userID]?.sessionID
return [...state, { ...userEvent, sessionID } ]
};
// idsToDelete is an array of item IDs to be deleted
const data = yield select( someItemsFromStore() )
idsToDelete = data.filter( item => item.rating < 5 )
// yielding put effects one-be-one
idsToDelete.forEach( id => {
yield put(deleteItem({id:i}))
});
// using yield all
// batch delete example
yield put ( batchDeleteItems({ itterator: item => item.rating < 5 }) ) ;
// batch update
yield put ( batchUpdate( { itterator: item => item.rating < 5 ? {...item, flag:true } : item } )
// optimized batch update
yield put ( batchUpdate( {
subSetItterator: item => item.rating < 5,
updateItterator: item => {...item, flag:true }
});
@x-labz
x-labz / sync.js
Last active June 18, 2021 12:26
Sync code
const run = () => {
const result = blockingFunction();
return result;
};
@x-labz
x-labz / async.js
Created June 18, 2021 12:16
Async
// blocking operation wrapped in promise
const blockingPromise = () =>
new Promise((resolve) => {
const result = blockingFunction();
resolve(result);
});
const promiseRun = () => {
blockingPromise().then((result) => {
console.log(`result: ${result}`);