Javascript:当另一个函数启动时,自动停止由异步函数创建的所有“线程”

问题描述 投票:0回答:1
我有多个用户可以随时调用的异步函数,但我想确保在调用新函数时停止所有先前运行的函数(以及它们可能产生的“线程”),否则他们会尝试使用不支持的相同资源(webcodec 解码器)。

我怎么能这么做?

我的尝试:目前,我使用一个可访问所有函数的全局计数器,我在所有函数的开头增加和复制该计数器,并且每次调用异步函数时,我都会向其发送计数器的副本,然后我在子例程的开头和返回后立即检查全局计数器是否已更改,但是当您有许多对异步函数的嵌套调用时,维护起来确实很繁重(因为您需要重复并传递复制变量的值)所有呼叫)。此外,如果我们调用的异步函数不是我自己编写的,那么这将不起作用。所以我更喜欢这样的东西:

functionCurrentlyRun = null async runFunction(f, args) { if (functionCurrentlyRun) { stopFunctionAndAllSubthreads(functionCurrentlyRun); } return await runAndSaveIn(f, args, functionCurrentlyRun) } async f1(args) { return await someAsyncCalls(); } f2(args) { return await someAsyncCalls(); } runFunction(f1, 42); runFunction(f2, 43);
有点类似于 

cancelAnimationFrame

 所做的事情,但是对于任意函数。

javascript race-condition
1个回答
0
投票
如果不修改任务以支持取消,就无法取消任意任务。 (就像整个事件循环并发模型与多线程相比,这是最好的。)

在实施方面用于支持取消的标准机制是

AbortSignal


    

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