Refre sh токен-сага с Redux-Saga - PullRequest
1 голос
/ 18 марта 2020

Я хочу создать какой-то один эффект фона для всех потенциальных открытых вкладок браузера.

Например, после успешного входа в систему я хочу начать refreshTokenFlow с delay(1000 * 60 * 2). Когда refreshTokenFlow активен, как сказать всем другим сагам дождаться выполнения этой саги, и только после успешного обновления токенов продолжить выполнение всех последующих саг.

Login saga

function * loginWatcher () {
  while (true) {
    const { Login, Pass } = yield take(LOGIN_REQUEST);
    const task = yield fork(loginFlow, Login, Pass);
  } 
}
function * loginFlow (Login, Pass) {
  let tokens;
  try {
    tokens = yield call(loginApi, Login, Pass);
    yield put({ type: LOGIN_SUCCESS, payload: tokens });
  } catch (error) {
    yield put({ type: LOGIN_FAIL});
  } finally {
    if (yield cancelled()) {
      createHistory.push('/')
    }
  }
  return tokens;
}
async function loginApi (Login, Pass) {
  try {
    const data = await customAxios.post(`${process.env.REACT_APP_API_URL}/auth/authentication`, { Login, Pass });
    return data.data;
  }
  catch (error) {
    return error;
  }
}

Другие саги

export function * vehiclesWatcher () {
  let getVehiclesTask;
  const requestChan = yield actionChannel(GET_VEHICLES_REQUEST);
  while (true) {
    yield takeEvery(ADD_SETTINGS_REQUEST, function * selectWim(action) {
      const {data} = action;
      yield put({ type: ADD_SETTINGS_SUCCESS, payload: data });
      createHistory.push("/vehicles")
    });
    yield take(requestChan);
    getVehiclesTask = yield fork(vehiclesFlow);
    yield take([CLEAR_VEHICLES_REQUEST]);
    yield cancel(getVehiclesTask);
  }
}
async function getAllVehicles (token, id, searchBy) {
  try {
    const res = await customAxios.post(`${API}/vehicle/getsorted?take=${15}`, 
      JSON.stringify({...searchBy, id }), configHeaders(token));
    return res.data;
  } catch (error) {
    throw error;
  }
}

function * vehiclesFlow () {
  try {
    while (true) {
      const accessToken = yield select(getToken);
      const searchBy = yield select(result);
      const wimId = yield select(getWimId);
      const vehicles = yield call(getAllVehicles, accessToken, wimId, searchBy);
      yield put ({type: GET_VEHICLES_SUCCESS, payload: vehicles});
      yield delay(5000);
    }
  } catch (error) {

  } finally {
    if (yield cancelled()) {
      yield put({type: CLEAR_VEHICLES_SUCCESS});
    }
  }
}

Root Сага

export default function* IndexSaga () {  
  yield all([
    loginWatcher(),
    vehiclesWatcher(),
  ]);
}

Действительно ли возможно создать такую ​​сагу, которая будет приостанавливать все другие саги, пока она не будет завершена?

Любые примеры, пожалуйста.

...