我开始像这样的多个“观察者”:
yield allMyTasks = [fork(fooWatcher), fork(barWatcher), fork(bazWatcher), fork(quxWatcher)];
这些都像这样开始一个takeEvery
:
function* fooWatcher() {
try {
yield takeEvery('FOO', fooWorker);
} finally {
if (yield cancelled()) {
console.log('fooWatcher was cancelled');
}
}
}
注销时,我取消allMyTasks
,如下所示:
yield cancel(...allMyTasks);
然而,由于finally
没有发生任何cancelled
区块。无论如何检测观察者的取消?
我测试了调度FOO
测试takeEvery
是否仍然存活cancel
并注意到即使finally-cancelled
没有触发,takeEvery
真的没有反应。所以真的被取消了吧?这个观察是否正确?这就是我所希望的,但是当takeEvery被取消时我需要做一个finally-cancelled
问题是takeEvery
帮助器是非阻塞的,因此解释器不会在try
块内等待,并且当saga运行时会立即调用finally
块中的代码。
为了使cancelled
效果发挥作用,你需要仍然在try
区块等待某事。
可能有一种更聪明的方式来写这个,但实现你想要的一种方法是等待一个永远不会被解决/拒绝的承诺。 (注意默认情况下某些Promise库可能具有的Promise超时)。
function* fooWatcher() {
try {
yield takeEvery('FOO', fooWorker);
yield new Promise(()=>{});
} finally {
if (yield cancelled()) {
console.log('fooWatcher was cancelled');
}
}
}
等待永远不会被派遣的行动也可以起作用,尽管我仍然认为还有其他一些明显的方法可以永远等待。