私はredux-sagasでnoobですので、私が明白な何かを忘れてしまったら、私に負担してください!1つの佐賀が他のものの前に完了することを確認する方法?
私はredux-sagaを使用して、OIDCプロバイダからaccess_tokenを取得し、ブラウザのlocalStorageに格納するシナリオを持っています。 私はまた、Sagasを使用してAPIエンドポイントからデータを取得します。 しかし、Auth Sagaがaccess_tokenで解決できるようになる前に、外部APIを呼び出すSagaが呼び出されるため、このアプローチで問題が発生しています。
マイ認証サーガ
export function * handleFetchTokens() {
try {
const token = yield cps(getToken)
localStorage.setItem('token', token)
const isAuthenticated = !!(token)
yield put(actions.checkAuthSuccess(isAuthenticated))
} catch (e) {
yield put(actions.checkAuthFailure(e))
}
}
export default function * sagas() {
yield fork(takeLatest, actions.CHECK_AUTH, handleFetchTokens)
}
マイAPIサーガ
export function * handleFetchItems() {
try {
const response = yield call(getItems)
yield put(actions.fetchItemsSuccess(response))
} catch (e) {
yield put(actions.fetchItemsFailure(e.errors))
}
}
export default function * sagas() {
yield fork(takeLatest, actions.FETCH_ITEMS, handleFetchItems)
}
マイルートサーガ
export default function * root() {
yield fork(items.sagas)
yield fork(authentication.sagas)
}
この問題を克服する適切な方法がどうあるべきか?
私はまだこの仕事をするのに苦労していますが、あなたの提案はかなり良いようです。私はあなたが言ったことに似た何かを実装できるかどうか疑問に思っていました: 'アクションがアプリケーションから送られる前にトークンを取得する'。これはもっとよく聞こえるよ! 基本的には、 'react-router'の' onEnter'にトークンをフェッチするアクションをディスパッチします。また、sagasの非同期性により、このトークンを使用する必要がある他のすべてのアクションを処理するのはかなり難しいものになります。 – Hawkes
おそらく、アプリケーションの開始時(アプリケーション/ルータをレンダリングする前)に単純なローダーをレンダリングしてトークンを要求するだけかもしれません。トークンを受け取ると、反応ルータを含むアプリケーション全体をレンダリングできます。このようにして、使用可能になる前にトークンを必要とする他のアクションを呼び出すことができるビューロジックは存在しなくなります。 –