【问题标题】:Resolving Array of Promises in Javascript在 Javascript 中解析 Promise 数组
【发布时间】:2021-05-06 07:45:14
【问题描述】:

我目前正在做一个小项目,遇到了这个问题。

这是我正在做的事情的一个小背景。首先,我使用Axios 同时调用 API,如下所示:

const [...result] = await Promise.all([
 axios.post('api-url', data, headers),
 axios.post('api-url', data, headers),
 axios.post('api-url', data, headers),
 axios.post('api-url', data, headers),
])

然后我映射结果数组并返回一组对象,如下所示:

//data array
const data = [{name: 'john'}, {name: 'jane'}, {name: 'doe}]

根据上面列出的数据数组,我像这样在我的 MongoDB 集合中创建新用户。

const result = data.map(async (item) => {
        return Promise.all([
            User.create({ name: item.name, }),
        ])
    })

现在,问题来了 - 当我执行 console.log(result) 时,我得到了一系列未解决的承诺,例如:

result [    
  Promise { <pending> },
  Promise { <pending> },
  Promise { <pending> },
  Promise { <pending> } 
]                       

我不知道这里发生了什么。据我了解,Promise.all() 旨在返回一系列已解决的承诺。我可能做错了什么?我该如何解决这个问题?任何帮助表示赞赏。非常感谢。

【问题讨论】:

  • 如果你能得到 200 状态的消息,那么只需运行一个队列,推送项目,然后 async/await 在返回 200 时通过函数调用队列中的下一个项目...跨度>

标签: javascript node.js mongodb promise axios


【解决方案1】:

我不知道这里发生了什么,据我了解 Promise.all() 旨在返回一组已解决的承诺。

没有。 Promise.all() 返回一个 Promise,当传递给它的所有 Promise 都已解决时,该 Promise 将解决。

第一次你使用它的时候(在代码块 1 中)你 await 返回值。 result 填充了传递给 Promise.all 的所有承诺的解析值。

另外一次你有一个名为result的变量:

const result = data.map(async (item) => {

您使用通过async 函数映射一些数据的结果填充它。

async 函数总是返回 Promises,所以你会得到一个存储在 result 中的 Promise 数组。

async 函数中你可以这样做:

    return Promise.all([
        User.create({ name: item.name, }),
    ])

这里使用Promise.all 是没有意义的。一开始你只向它传递一个承诺。

你需要

  1. 收集每次调用User.create返回的promise
  2. 使用Promise.all 获得一个在它们都准备好时解析的promise
  3. 等待该承诺解决

这样的:

const promises = data.map( item => User.create({ name: item.name }) );
const results = await Promise.all(promises);

【讨论】:

    猜你喜欢
    • 2020-06-27
    • 2015-08-15
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    相关资源
    最近更新 更多