dvaにおけるeffect内で別のeffectを呼び出すputブロック呼び出しを実現する方法
8440 ワード
dvaにおけるeffect内で別のeffectを呼び出すputブロック呼び出しを実現する方法
プロジェクトでは通常、1つのeffectで別のeffectを呼び出す必要があります.実装方法はputを直接使用することです.
しかしputはブロックされていない方法であり、putの使用効果は外部でdispatchを使用するのと同じであるため、上のコード出力順序はa,c,bであり、bが実行されてからaを実行するのを待つには
このような閉塞の需要はよく見られるので、この方法は非常に有用である.
しかし、ここで疑問があるのは、
プロジェクトでは通常、1つのeffectで別のeffectを呼び出す必要があります.実装方法はputを直接使用することです.
*a({ payload}, {put, call,take}) {
try {
console.log(a)
yield put({type: 'b',payload: {}});
console.log(c)
const info = yield call(serviceA, payload);
put({
type: 'save',
payload: info,
})
}catch(e) {
}
},
*b({ payload}, {put, call,take}) {
yield call(serviceB, payload);
console.log('b')
}
しかしputはブロックされていない方法であり、putの使用効果は外部でdispatchを使用するのと同じであるため、上のコード出力順序はa,c,bであり、bが実行されてからaを実行するのを待つには
take
、take
がredux-sagaである方法はもちろんdvaにもあり、dispatchからのactionを一度に傍受するために使われている.さらにeffectの前後に/@@start
と/@@end
のactionが追加的にトリガーされ、/@@end
をリスニングしてeffectの実行終了をリスニングすることができます.コードは以下の通りです. *a({ payload}, {put, call,take}) {
try {
console.log(a)
yield put({type: 'b',payload: {}}); // b
yield take('b/@@end') // b
console.log(c)
const info = yield call(serviceA, payload);
put({
type: 'save',
payload: info,
})
}catch(e) {
}
},
*b({ payload}, {put, call,take}) {
yield call(serviceB, payload);
console.log('b')
}
このような閉塞の需要はよく見られるので、この方法は非常に有用である.
しかし、ここで疑問があるのは、
call
メソッドもeffectをトリガーできるようで、ドキュメントの中にはいくつかありますが、実際の使用ではcall
内部にメソッドパラメータが伝達されなければならないので、何の問題なのか分かりません.call
はもともとブロックメソッドで、call
を直接使用できれば最高です.issuseは解決してほしいと提案しています.