解析 Javascript 中的承诺数组

Resolving Array of Promises in Javascript

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

这是我正在做的事情的一些背景信息。首先,我像这样同时调用 API 和 Axios

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() 意味着 return 一系列已解决的承诺。我做错了什么?我该如何解决这个问题?任何帮助表示赞赏。非常感谢。

I don't know what's happening here, from my understanding Promise.all() is meant to return an array of resolved promises.

没有。 Promise.all() return 当传递给它的所有承诺都已解决时,承诺就会解决。

第一次 使用它时(在代码块 1 中)您 await return 值。 result 填充了传递给 Promise.all.

的所有承诺的已解决值

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

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

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

async 始终运行 return Promise,因此您将获得存储在 result.

中的一组 Promise

async 函数中,您可以这样做:

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

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

你需要

  1. 从对 User.create
  2. 的每次调用中收集 return 的承诺
  3. 使用 Promise.all 获得一个承诺,当他们都准备好时解决
  4. 等待承诺解决

这样的:

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