我启动了多个"观察者"像这样:
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
未触发,finally-cancelled
也是如此真的没有回应。所以真的被取消了吧?这个观察是否正确?这是我希望的,但是当takeEvery被取消时我需要做<div class="container-fluid">
<div *ngFor="let folder of folders" class="col-3">
<a [routerLink]="[`/class/board/${folder?.folder}`]">
<div class="folder">
<h6>{{folder?.folder}}</h6>
</div>
</a>
</div>
</div>
答案 0 :(得分:1)
问题是takeEvery
帮助器是非阻塞的,因此解释器不会在try
块内等待,并且当finally
块中的代码立即被调用时saga正在运行。
要使cancelled
效果发挥作用,您需要继续在try
块中等待。
可能有一种更聪明的方式来写这个,但实现你想要的一种方法是等待一个永远不会被解决/拒绝的承诺。 (注意默认情况下某些Promise库可能有的Promise超时)。
function* fooWatcher() {
try {
yield takeEvery('FOO', fooWorker);
yield new Promise(()=>{});
} finally {
if (yield cancelled()) {
console.log('fooWatcher was cancelled');
}
}
}
等待永远不会被派遣的行动也可以起作用,尽管我仍然认为还有其他一些明显的方法可以永远等待。