javascript - 在 Node js/javascript中的 map 函数之外获取异步等待数据

标签 javascript node.js dictionary async-await

let object = [{
  id: `01`, name: `fish`, type: `marine`,
}, {
  id: `02`, name: `fish`, type: `fresh`,
}, {
  id: `03`, name: `fish`, type: `tank`,
}, {
  id: `04`, name: `animal`, type: `pet`,
}, {
  id: `05`, name: `animal`, type: `wild`,
}, {
  id: `06`, name: `animal`, type: `zoo`,
}, {
  id: `07`, name: `food`, type: `veg`,
}, {
  id: `08`, name: `food`, type: `non-veg`,
}]

let data = []
object.map((value) => {
  data.push([value.name, value.type])
})

console.log(data)

在第一个示例中我可以在 map 函数之外获取数据,但在第二个示例中我无法获取数据

let object = [{
  id: `01`, name: `fish`, type: `marine`,
}, {
  id: `02`, name: `fish`, type: `fresh`,
}, {
  id: `03`, name: `fish`, type: `tank`,
}, {
  id: `04`, name: `animal`, type: `pet`,
}, {
  id: `05`, name: `animal`, type: `wild`,
}, {
  id: `06`, name: `animal`, type: `zoo`,
}, {
  id: `07`, name: `food`, type: `veg`,
}, {
  id: `08`, name: `food`, type: `non-veg`,
}]
    
let data=[];
let test;
object.map(async (value) => {
  test = await getValue(value.name);
  data.push([value.name,value.type,test]);            
})
console.log(data);

如第一个示例所示,我可以轻松地在 map 函数之外获取数据,但在第二个函数中我得到空白数组,如何在 map 函数之外获取异步等待数据

  • 我哪里做错了,我不明白

最佳答案

请注意,map 函数会生成一个 Promise 对象作为每个项目的返回值。

data 完成收集所有数据的时刻应该在所有 Promise 完成之后发生。

因此,为了确保过程完成,请在使用数据之前使用await Promise.all()

let object = [{
  id: `01`, name: `fish`, type: `marine`,
}, {
  id: `02`, name: `fish`, type: `fresh`,
}, {
  id: `03`, name: `fish`, type: `tank`,
}, {
  id: `04`, name: `animal`, type: `pet`,
}, {
  id: `05`, name: `animal`, type: `wild`,
}, {
  id: `06`, name: `animal`, type: `zoo`,
}, {
  id: `07`, name: `food`, type: `veg`,
}, {
  id: `08`, name: `food`, type: `non-veg`,
}]

let data=[];
let test;
let promises = object.map(async (value) => {
  test = await getValue(value.name);
  data.push([value.name,value.type,test]);            
})

// 1. This line matters
await Promise.all(promises);
console.log(data);

// 2. Or if you cannot use await here
Promise.all(promises).then(() => {
  console.log(data);
});

顺便说一句,由于 getValue 函数是异步的,因此您可能会以完全随机的顺序获取数据,如果您关心顺序,则可能需要另一种方法。

关于javascript - 在 Node js/javascript中的 map 函数之外获取异步等待数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68449668/

相关文章:

javascript - CSS/JS : CPU lightweight loading spinner

javascript - 使用 AngularJS 中的链接覆盖单击表

node.js - 文档插入中调用函数

python - 使用 type(a) 作为字典键是否合理?

python - 如何删除 JSON 对象的属性

javascript nextsibling 函数

node.js - 单个用户的 Node WebKit 安装程序

node.js - 动态方法参数

dictionary - 在 Tcl 中检查参数是否为字典

javascript - 一个函数出错后,Javascript函数不起作用