停止自定义事件上的所有嵌套承诺

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

我有函数在循环中启动许多基于promise的函数,例如:

let doSomething = (page, a, b) => {
    return new Promise(async(resolve, reject) => {

        eventBus.on('game::lag', () => {
            throw new Error('Game lag');
        });

        while(a.length > 0) {
            await doSomethingAsync();
            await doSomething2Async();

            while(b.length > 0) {
                await doSomething3();
                b = await getAsyncB();  
            }    
            a = await getAsyncA();  
        }
        resolve();
    });
};

现在关于自定义事件,它来自程序的其他部分,我希望这个脚本死掉并停止每个嵌套函数(doSomething*函数)。另外我在doSomething*函数中有一些间隔,但我希望一切都停止间隔。

我在示例代码中尝试过,错误被抛出并成功捕获到外部文件中。但是我可以看到qazxsw poi脚本仍在运行。

是否正常,虽然我从“父”抛出错误,但嵌套函数仍在运行?

javascript events promise break cancellation
3个回答
1
投票

异常不会从“父”抛出,它会在事件处理程序中抛出。这与异步函数的执行无关。你需要类似的东西

doSomething*

或者,您可以从处理程序设置async function doSomething(page, a, b) { const lagError = new Promise((resolve, reject) => { eventBus.on('game::lag', () => { reject(new Error('Game lag')); }); }); while(a.length > 0) { await Promise.race([lagError, doSomethingAsync()]); await Promise.race([lagError, doSomething2Async()]); while(b.length > 0) { await Promise.race([lagError, doSomething3()]); b = await Promise.race([lagError, getAsyncB()]); } a = await Promise.race([lagError, getAsyncA()]); } } 标志,并在每两个异步操作之间执行error检查。


1
投票

这是正常的,在侦听器内抛出的错误不会影响异步函数,因为它们不在同一个调用堆栈中。

如果你希望一切都停止接收你的信号,你最好使用像发电机功能这样的东西来获得更细粒度的控制。


0
投票

类似的东西,当action设置为false时停止你在异步函数中做的事情

if (error) throw new Error(…)
© www.soinside.com 2019 - 2024. All rights reserved.