我有函数在循环中启动许多基于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脚本仍在运行。
是否正常,虽然我从“父”抛出错误,但嵌套函数仍在运行?
异常不会从“父”抛出,它会在事件处理程序中抛出。这与异步函数的执行无关。你需要类似的东西
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
检查。
这是正常的,在侦听器内抛出的错误不会影响异步函数,因为它们不在同一个调用堆栈中。
如果你希望一切都停止接收你的信号,你最好使用像发电机功能这样的东西来获得更细粒度的控制。
类似的东西,当action设置为false时停止你在异步函数中做的事情
if (error) throw new Error(…)