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

问题描述 投票:0回答:1

我开始像这样的多个“观察者”:

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

redux-saga
1个回答
1
投票

问题是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');
        }
    }
}

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

© www.soinside.com 2019 - 2024. All rights reserved.