假设我们有多个并发任务,每个任务在某个时间点或另一个时间点至少执行一个Web请求,并且它们需要一段时间才能完成。假设它们在执行过程中的任意点上也可能运行或可能不运行返回promise的函数。假设还需要确保其中的某些承诺不会同时运行。
我可以在一个汇合点上满足所有这些并发任务,从这些函数中创建一个承诺链,这些函数返回不应同时运行的承诺,并在所有这些操作完成之后继续执行。如果这些任务中的一些任务比其他任务显着更快地到达集合点,但是在集合点之后仍然有很多工作要做,这可能会导致无用等待。
此外,我还尝试过实现一个简单的promise队列,如下所示:
function PromiseQueue() { var promise = Promise.resolve(); return { push: function(fn) { promise = promise.then(fn, fn); return this; } } }
此队列可以工作,但有一个问题,我看不到从并发任务中的一个向队列发送函数的方法,也没有等待仅当队列决定处理已发送项目后才可用的结果的方法,更不用说在将函数发送到队列时尚未构建promise,因此在将promawn生成函数发送到队列时没有什么可等待的。
我想通过坚持ECMAScript 2017 async / await格式和ES6承诺来实现上述目标。
以下是描述的问题的示例,其中包含2个并发任务,其中subPromise1和subPromise2不应同时执行,但当前编写有可能,但是我想为任意数量的并发任务提供通用解决方案。
这是一个工作提琴,可以看到最初描述的问题:https://jsfiddle.net/40gchrw6/async function async1() { //do some long running work const sPResult = await subPromise1; //do some more long running work depending on sPResult } async function async2() { //do some different long running work const sPResult = await subPromise2; //do some more different long running work depending on sPResult } async function mainFunction() { //something const totalResult = await Promise.all([async1,async2]); //something else }
编辑:
EDIT:
这是一个可行的解决方案:https://jsfiddle.net/f2ewsugm/1/假设我们有多个并发任务,每个任务在某个时间点或另一个时间点至少执行一个Web请求,并且它们需要一段时间才能完成。假设它们在...
为必须按顺序执行的promise链创建一个封闭范围(一个类可能有意义)。当您到达必须是顺序的步骤时,请将其添加到链中。