【问题标题】:Performing a Promise.all with parameters使用参数执行 Promise.all
【发布时间】:2020-01-31 07:58:00
【问题描述】:

我正在尝试创建一个我想要实现的 Promise 数组,但不确定如何最好地循环它们。

我认为下面的代码可以解决问题,但是当我创建 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.all 中调用,但事实并非如此。

有人可以解释并解释应该如何做到这一点吗?

【问题讨论】:

    标签: javascript typescript ecmascript-6 promise


    【解决方案1】:

    promise 在创建时立即开始。没有“start()”方法,因此您所要做的就是确保仅在需要时创建 Promise。我会将创建您的承诺的调用包装在一个 async 函数中,该函数仅在应创建承诺时调用,然后在该函数内的 Promise.all() 上调用 await,正如您所打算的那样。

    您也可以考虑将 Promise 包装在异步函数中并创建一个异步函数数组 - 除非您仍然需要遍历数组并调用每个函数来检索创建的 Promise 并等待它们。可能是这样的:

    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数组。

    【讨论】:

    • 这不是将几个承诺包装在一个大承诺中吗?
    • 要么就是这样,要么将每个 Promise 包装在一个异步函数中,然后创建一个异步函数数组。
    【解决方案2】:

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

    const names = ['Dan', 'Mitchell', 'Josh']
    
    const data = await Promise.all(names.map(name => doStuff(name)));
    console.log(data);
    

    【讨论】:

    • 当我运行它并注释掉 await Promise.all(promises) 它仍然运行 3 次。
    • 抱歉,我的错,我编辑了我的帖子以反映更改。如果我没记错的话,没有本地方法可以将承诺保持在“待处理”状态,但我记得有一些包可以做到这一点,尽管我更喜欢这种方式。
    • 标准是expecting the behaviour of the promises created in the map to remain in a drafted state。您只是在为同一件事创建快捷方式。
    猜你喜欢
    • 2019-01-28
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    • 2019-07-17
    • 2020-05-13
    • 1970-01-01
    相关资源
    最近更新 更多