2016-10-23 3 views
0

Мой поток адаптационный пользователь:Как заблокировать временные блокировки изменений маршрута реактивного маршрутизатора в Redux-Saga?

  1. аутентификации пользователя через Google & попадает isRegistrationDone: false
  2. пользователь подтверждает информацию о профиле, щелкает save
  3. save бросает redux action REGISTRATION_COMPLETE, наборы профилей для isRegistrationDone: true

В мой sagas, я проверяю флаг isRegComplete: false. если он обнаружен, я хочу, чтобы все изменения маршрута пользователю перенаправлять /reg

function* fetchUserProfile(action) { 
    const { uid } = authUser 
    const path = getRootPath('userProfiles') 
    let userProfile = // retrieve from database 

    if (userProfile.isRegistrationDone === false) { 
    browserHistory.push('/reg') 
    yield call(watchRouteChanges) 
    let confirmedUserInfo = yield take(REGISTRATION_COMPLETE) 
    // ... write to database 
    yield cancel(watchRouteChanges) 
    } 

    browserHistory.push('/dash') 
} 

function* watchRouteChanges() { 
    fork(takeEvery, LOCATION_CHANGE, redirectToRegistration) 
    return 
} 
function redirectToRegistration(action) { 
    const destination = action.payload.pathName 
    if (destination !== '/reg') browserHistory.push('/reg') 
    return 
} 

это работает не hunky-dory до yield cancel(watchRouteChanges), который бросает:

utils.js:191 uncaught at sagas 
at takeEvery 
at fetchUserProfile 
Error: cancel(task): argument function watchRouteChanges() { 
     return _regenerator2.default.wrap(function watchRouteChanges$(_context2) { 
     while (1) { 
      switch (_context2.prev = _context2.next) { 
      case 0: 
       (0, _effects.fork)(_reduxSaga.takeEvery, _location.LOCATION_CHANGE, redirectToRegistration); 
       return _context2.abrupt('return'); 

      case 2: 
      case 'end': 
       return _context2.stop(); 
      } 
     } 
     }, _marked[1], this); 
    } is not a valid Task object 
(HINT: if you are getting this errors in tests, consider using createMockTask from redux-saga/utils) 
    at cancel (http://192.168.0.103:3000/app.1b8181c5bf9c72be8a4e.js:27590:12) 
    at fetchUserProfile$ (http://192.168.0.103:3000/app.1b8181c5bf9c72be8a4e.js:27992:39) 
    at tryCatch (http://192.168.0.103:3000/app.1b8181c5bf9c72be8a4e.js:26312:41) 
    at Generator.invoke [as _invoke] (http://192.168.0.103:3000/app.1b8181c5bf9c72be8a4e.js:26586:23) 
    at Generator.prototype.(anonymous function) [as next] (http://192.168.0.103:3000/app.1b8181c5bf9c72be8a4e.js:26345:22) 
    at next (http://192.168.0.103:3000/app.1b8181c5bf9c72be8a4e.js:28480:28) 
    at Object.currCb [as cont] (http://192.168.0.103:3000/app.1b8181c5bf9c72be8a4e.js:28554:8) 
    at end (http://192.168.0.103:3000/app.1b8181c5bf9c72be8a4e.js:28521:24) 
    at Object.task.cont (http://192.168.0.103:3000/app.1b8181c5bf9c72be8a4e.js:28331:12) 
    at next (http://192.168.0.103:3000/app.1b8181c5bf9c72be8a4e.js:28490:36)log @ utils.js:191end @ proc.js:299abort @ proc.js:95task.cont @ proc.js:108end @ proc.js:305abort @ proc.js:95task.cont @ proc.js:108end @ proc.js:305abort @ proc.js:95task.cont @ proc.js:108next @ proc.js:281currCb @ proc.js:338end @ proc.js:305task.cont @ proc.js:115next @ proc.js:274currCb @ proc.js:338checkEffectEnd @ proc.js:579chCbAtIdx @ proc.js:594currCb @ proc.js:338 

Логика Перенаправление кажется, работает хорошо, но я, конечно, нужно чтобы отменить его, чтобы этот процесс работал.

Есть ли лучший способ сделать это? или ошибка в моем подходе?

ответ

0

Эффект cancel ожидает дескриптор задач как аргумент, а не функцию/генератор или что-то еще. В вашем случае:

... 
if (userProfile.isRegistrationDone === false) { 
    browserHistory.push('/reg') 
    const task = yield call(watchRouteChanges) // <-- Save task descriptor 
    let confirmedUserInfo = yield take(REGISTRATION_COMPLETE) 
    // ... write to database 
    yield cancel(task) // <-- Pass descriptor for cancellation 
} 
... 

Пожалуйста, проверка на документы: http://yelouafi.github.io/redux-saga/docs/api/index.html#canceltask

 Смежные вопросы

  • Нет связанных вопросов^_^