用参数执行Promise.all

时间:2019-10-02 03:07:28

标签: javascript typescript ecmascript-6 promise

我正在尝试创建一个我想履行的承诺数组,但是不确定如何最好地遍历它们。

我以为下面的代码可以解决问题,但是当我创建承诺数组时就会出现,实际上是我将它们称为副作用,在Promise.all被击中之前,我不希望这样做。

import wait from 'waait'

const main = async () => {
    console.log('Start')
    const doStuff = async (name) => {
        console.log('Do stuff called', name)
        await wait(500)
        return name + ' is cool'
    }


    const names = ['Dan', 'Mitchell', 'Josh']

    const promises = names.map(name => doStuff(name))

    // const data = await Promise.all(promises)
    // console.log(data)
    console.log('End')
}

main()

我发现在最后两行被注释掉后,doStuff函数似乎在console.log正在控制台中被调用。

我期望在地图中创建的诺言的行为保持在草稿状态,然后在Promise中调用。所有的情况并非如此。

有人可以解释并提供关于应该如何执行的解释吗?

2 个答案:

答案 0 :(得分:4)

承诺创建后立即开始。没有“ start()”方法,因此您要做的就是确保仅在需要时创建承诺。我将在async函数中包装用于创建您的Promise的调用,该函数仅在应创建Promise时才被调用,然后按照您的意图在该函数内的awaitPromise.all()

您还可以考虑将诺言包装在异步函数中,而是创建一个异步函数数组-除非您仍需要遍历该数组并调用每个函数以检索创建的诺言并等待它们。也许像这样:

var pending = names.map(n => async ()=>await doStuff(n));  // (warning: untested; off the top of my head)

然后您将一系列待处理的Promise封装在函数中。时间到了,您可以使用var promises = pending.map(f=>f())来调用函数并创建一个Promise数组。

答案 1 :(得分:0)

您可以在Promise.all()内创建承诺:

const names = ['Dan', 'Mitchell', 'Josh']

const data = await Promise.all(names.map(name => doStuff(name)));
console.log(data);