ES6并发异步函数有可能等待不应该并发的子承诺?

问题描述 投票:0回答:1

假设我们有多个并发任务,每个任务在某个时间点或另一个时间点至少执行一个Web请求,并且它们需要一段时间才能完成。假设它们在执行过程中的任意点上也可能运行或可能不运行返回promise的函数。假设还需要确保其中的某些承诺不会同时运行。

我可以在一个汇合点上满足所有这些并发任务,从这些函数中创建一个承诺链,这些函数返回不应同时运行的承诺,并在所有这些操作完成之后继续执行。如果这些任务中的一些任务比其他任务显着更快地到达集合点,但是在集合点之后仍然有很多工作要做,这可能会导致无用等待。

此外,我还尝试过实现一个简单的promise队列,如下所示:

function PromiseQueue() {
    var promise = Promise.resolve();

    return {
        push: function(fn) {
            promise = promise.then(fn, fn);
            return this;
        }
    }
}

此队列可以工作,但有一个问题,我看不到从并发任务中的一个向队列发送函数的方法,也没有等待仅当队列决定处理已发送项目后才可用的结果的方法,更不用说在将函数发送到队列时尚未构建promise,因此在将promawn生成函数发送到队列时没有什么可等待的。

我想通过坚持异步/等待格式来实现上述目标,并且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
}

假设我们有多个并发任务,每个任务在某个时间点或另一个时间点至少执行一个Web请求,并且它们需要一段时间才能完成。假设它们在...

javascript ecmascript-6 async-await es6-promise ecmascript-2017
1个回答
0
投票

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


0
投票

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

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