观察者没有被取消 - 如何在takeEvery上最终取消检测

时间:2018-02-25 18:08:26

标签: redux-saga

我启动了多个"观察者"像这样:

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以测试cancelfinally-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>

1 个答案:

答案 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');
        }
    }
}

等待永远不会被派遣的行动也可以起作用,尽管我仍然认为还有其他一些明显的方法可以永远等待。