在 Javascript 数组映射中使用 promise 函数

Posted

技术标签:

【中文标题】在 Javascript 数组映射中使用 promise 函数【英文标题】:Using promise function inside Javascript Array map 【发布时间】:2017-01-19 23:53:51 【问题描述】:

拥有一个对象数组 [obj1, obj2]

我想使用 Map 函数对所有这些对象进行数据库查询(使用 Promise)并将查询结果附加到每个对象。

[obj1, obj2].map(function(obj)
  db.query('obj1.id').then(function(results)
     obj1.rows = results
     return obj1
  )
)

当然这样不行,输出数组是[undefined, undefined]

解决此类问题的最佳方法是什么?我不介意使用异步等其他库

【问题讨论】:

这个问题不应该被标记为重复。这个问题专门关于在map 中使用承诺,不是一般来说异步是如何工作的。 【参考方案1】:

将您的数组映射到 Promise,然后您可以使用 Promise.all() 函数:

var promises = [obj1, obj2].map(function(obj)
  return db.query('obj1.id').then(function(results)
     obj1.rows = results
     return obj1
  )
)
Promise.all(promises).then(function(results) 
    console.log(results)
)

【讨论】:

【参考方案2】:

你没有在 map 函数中返回你的 Promise。

[obj1, obj2].map(function(obj)
  return db.query('obj1.id').then(function(results)
     obj1.rows = results
     return obj1
  )
)

【讨论】:

【参考方案3】:

使用异步/等待的示例:

const mappedArray = await Promise.all(
  array.map(p => 
    return getPromise(p).then(i => i.Item);
  )
);

【讨论】:

【参考方案4】:

您也可以使用for await 代替map,并在其中解决您的承诺。

【讨论】:

以上是关于在 Javascript 数组映射中使用 promise 函数的主要内容,如果未能解决你的问题,请参考以下文章

[从`prom-client`模块导入`prom`,但已安装。如何“相应地导入prom-client”?

映射/挖掘嵌套在对象中的数组 - JavaScript

数组的性能包括与映射到对象并在 JavaScript 中访问它

如何映射 javascript 数组的 i 和 i+1 值?

JavaScript常用单词整理总结

JavaScript中数组的集合和映射