ECMAScript 2017并发异步功能是否有可能等待不应该并发的子承诺?

假设我们有多个并发任务,每个任务在某个时间点或另一个时间点至少执行一个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/

ydp1016 回答:ECMAScript 2017并发异步功能是否有可能等待不应该并发的子承诺?

为必须按顺序执行的promise链创建一个封闭范围(一个类可能有意义)。当您到达必须是顺序的步骤时,请将其添加到链中。

Class AsyncThing {
  constructor() {
    this.promises = Promise.resolve()
  }

  async async1() {
    //do some long running work
    // assuming subPromise1 is a promise-returning function that must be chained
    let sPResult
    this.promises = this.promises.then(subPromise1).then(result => sPResult = result)
    await this.promises;
    //do some more long running work depending on sPResult
  }

  async async2() {
    //do some different long running work
    // assuming subPromise2 is a promise-returning function that must be chained
    let sPResult
    this.promises = this.promises.then(subPromise2).then(result => sPResult = result)
    await this.promises;
    //do some more different long running work depending on sPResult
  }

  async mainFunction() {
    //something
    const totalResult = await Promise.all([async1,async2]);
    //something else
  }
}
本文链接:https://www.f2er.com/2816388.html

大家都在问