function rejectEffect(effectId, error) { const effect = effectsById[effectId] computeEffectDur(effect) effect.status = REJECTED effect.error = error if(effect && asEffect.race(effect.effect)) { setRaceWinner(effectId, error) } }
export function* watchStartBackgroundApiTask(req) { yield race({ task: call(apiServices.handler, req), cancel: take(`${sysActions.cancelApiTasks}`) }) }
export function* triggerCardAsync(action) { const openedCards = yield select(selectOpenedNotGuessedCards); if (openedCards.length === 0) { yield put(triggerCard(action.payload.id)); } if (openedCards.length === 1) { yield put(triggerCard(action.payload.id)); yield race({ task: call(validateCardsAsync), cancel: take(TRIGGER_CARD_ASYNC), }); } if (openedCards.length > 1) { yield put({ type: VALIDATE_CARDS }); yield put(triggerCard(action.payload.id)); } }
function* counter() { while (yield take(at.START)) { while (true) { const { count } = (yield select()).counter; const { stop } = yield race({ stop: take(at.STOP), timer: call(delay, SECOND) }); if (stop) { break; } else { yield put(actions.setCount(count + 1)); } } } }
export function* handleFetch({ payload: config, meta: { name } }) { yield call(delay, 200); const { fetch } = yield race({ fetch: call(fetchSaga, config), cancel: take(filterAction), }); if (fetch) { const { response, error } = fetch; if (error) { yield put(fetchError({ error, name })); return; } yield put(fetchSuccess({ response, name })); } }
test('loginFlow saga with logout as race winner', t => { let gen = loginFlow() let loginRace = race(raceObject) let logOutWinner = {logout: true} t.deepEqual( gen.next().value, take(constants.LOGIN_REQUEST) ) t.deepEqual( gen.next(data).value, loginRace ) t.deepEqual( gen.next(logOutWinner).value, put(actions.setAuthState(false)) ) t.deepEqual( gen.next().value, call(logout) ) })
function resolveEffect(effectId, result) { const effect = effectsById[effectId] if(is.task(result)) { result.done.then( taskResult => { if(result.isCancelled()) { cancelEffect(effectId) } else { resolveEffect(effectId, taskResult) } }, taskError => rejectEffect(effectId, taskError) ) } else { computeEffectDur(effect) effect.status = RESOLVED effect.result = result if(effect && asEffect.race(effect.effect)) { setRaceWinner(effectId, result) } } }
export function* handleLoadModel(action) { if (!action || !action.payload) { return; } const token = yield select(fromUser.getToken); try { const { file, cancel } = yield race({ file: call(loadModelFile, action.payload, token), cancel: take([LOCATION_CHANGE]), }); if (cancel) { return; } yield put(importFieldsSuccess(file)); } catch (error) { yield put(importFieldsError(error)); } }
race({ ok: take(PUBLISH_CONFIRM), cancel: take(PUBLISH_CANCEL),
export function* handleUploadFile(action) { if (!action || !action.payload) { return; } try { preventUnload(); const parserName = yield select(fromUpload.getParserName); const token = yield select(fromUser.getToken); const { file, cancel } = yield race({ file: call(loadDatasetFile, action.payload, token, parserName), cancel: take([LOCATION_CHANGE]), }); allowUnload(); if (cancel) { return; } yield take(FINISH_PROGRESS); yield put(uploadSuccess(file)); } catch (error) { allowUnload(); yield put(uploadError(error)); } }
function* typing(action) { try { while (true){ yield take(textUpdate); yield put({type: typingStart}); while (true){ const {updated, timeouted} = yield race({ updated: take(textUpdate), timeouted: call(delay, 1000), }) if (timeouted) { yield put({type: typingEnd}); break; } } } } catch (e) { yield put({type: "Welp, we did it"}); } }
function* requestPhotos({ id, uri }) { const cachedPhotos = yield select(photosSelector, id); if (!cachedPhotos) { try { const { photos, cancel } = yield race({ photos: call(request, uri), cancel: take(PHOTOS_CLEANUP) }); if (photos) { yield put(receivePhotos(id, photos)); } else if (cancel) { console.log('Photos request cancelled!'); } } catch (error) { console.log('Photos request failed!'); } } }
test('loginFlow saga with success', t => { let gen = loginFlow() let loginRace = race(raceObject) let authWinner = {auth: true} t.deepEqual( gen.next().value, take(constants.LOGIN_REQUEST) ) t.deepEqual( gen.next(data).value, loginRace ) t.deepEqual( gen.next(authWinner).value, put(actions.setAuthState(true)) ) t.deepEqual( gen.next().value, put(actions.changeForm(blankForm)) ) })
function rejectEffect(effectId, error) { const effect = effectsById[effectId] computeEffectDur(effect) effect.status = REJECTED effect.error = error if(effect && asEffect.race(effect.effect)) { setRaceWinner(effectId, error) } }
function resolveEffect(effectId, result) { const effect = effectsById[effectId] if(is.task(result)) { result.done.then( taskResult => { if(result.isCancelled()) { cancelEffect(effectId) } else { resolveEffect(effectId, taskResult) } }, taskError => rejectEffect(effectId, taskError) ) } else { computeEffectDur(effect) effect.status = RESOLVED effect.result = result if(effect && asEffect.race(effect.effect)) { setRaceWinner(effectId, result) } } }