假设我们有多个并发任务,每个任务在某个时间点或另一个时间点至少执行一个Web请求,并且它们需要一段时间才能完成。假设它们在执行过程中的任意点上也可能运行或可能不运行返回promise的函数。假设还需要确保其中的某些承诺不会同时发生。
我可以在一个汇合点上满足所有这些并发任务,从这些函数中创建一个诺言链,这些函数返回不应同时运行的诺言,并在所有这些完成之后继续执行。如果这些任务中的某些任务比其他任务显着更快地到达集合点,但是在集合点之后仍然有大量工作要做,则存在潜在的无用等待的缺点。
此外,我还尝试过实现一个简单的Promise队列,如下所示:
function PromiseQueue() {
var promise = Promise.resolve();
return {
push: function(fn) {
promise = promise.then(fn,fn);
return this;
}
}
}
此队列可以工作,但是有一个问题,我看不到从并发任务之一向队列发送函数的方法,也没有等待仅当队列决定处理已发送项目时才可用的结果的方法,更不用说在将函数发送到队列时尚未构建诺言,因此在将诺言生成功能发送到队列时无需等待。
我想通过坚持ECMAScript 2017 async / await格式和ES6承诺来实现上述目标。
下面是描述的问题的示例,其中包含2个并发任务,其中subPromise1和subPromise2不应同时执行,但由于当前编写有可能,但我希望有一个通用的解决方案,可以处理任意数量的并发任务。
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
}
编辑: 这是一个工作提琴,可以看到最初描述的问题:https://jsfiddle.net/40gchrw6/
编辑:这是一个可行的解决方案:https://jsfiddle.net/f2ewsugm/1/