【问题标题】:Using async-await value inside map function using node js/ javascript [duplicate]使用节点js / javascript在map函数中使用async-await值[重复]
【发布时间】:2021-09-27 21:49:34
【问题描述】:
function testData() {
  return new Promise((resolve, reject) => {
    Data.findAll({
      where: {
        adress: "New York",
      },
      attributes: [
        "id", "name", "type"
      ]
    }).then((object) => {

      let data1 = [],
        data2 = [];
      object.map(async (value) => {
        data1.push([value.name, value.type]);
      });
      console.log("data1 Value", data1);

      let test;
      object.map(async (value) => {
        test = await getValue(value.name);
        data2.push([value.name, value.type, test]);
      });
      console.log("data1 Value", data2);
    }).catch((err) => {
      return reject(err);
    });
  });
}

所以我编写了一个代码来从数据库中获取数据并将其保存在对象中

下面例如从数据库中获取此数据,以便我的对象包含此值

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`,
}]
    
let data1=[],data2=[];

object.map(async (value) => {
  data1.push([value.name,value.type]);            
})
console.log("data1 Value",data1);

let test;
object.map(async (value) => {
 test = await getValue(value.name);
  data2.push([value.name,value.type,test]);            
})
console.log("data1 Value",data2);

如您所见,我在 map 函数内部编写 async 和 await,在 map 函数外部安慰数据,但它不起作用,在 data1 中,我得到了值,但在 data2 内部得到了空白值。

我不确定我应该怎么做才能在我的data2 中获取测试值

这里getValue() 是冗长的代码,这就是为什么我可以发布但它的工作代码,因为我可以控制它的价值。

【问题讨论】:

  • map 已经返回一个数组,不需要推入一个新数组。你可以只返回值。这个返回的数组包含你所有的承诺,然后你可以将它们传递给Promise.all()
  • 1.不要使用.map() 进行简单的数组迭代。使用.forEach() 或实际循环。 2. async/await 不能与 .map()/.forEach() 以您的方式工作。您需要使用 Promise.all() 和 *return 值,或者如果序列相关,则使用常规循环。
  • 与您的问题无关,但不要在其使用范围之外声明test。
  • promise.all() 我应该在哪里写@VLAZ
  • @Aakash 检查重复项。应该是Promise.all(object.map(value => getValue(value.name)))。它仍然返回一个将解析为所有值的数组的承诺。

标签: javascript node.js async-await promise conditional-statements


【解决方案1】:

首先,您为什么要为此使用地图? map 返回一个新数组。您应该为此使用 forEach/for 循环。

据我所知,第二个你不应该在 map 数组方法中使用异步的东西。删除数组方法中的 async/await 。所以现在你得到了一系列未解决的承诺

循环结束后 使用 Promise.all([...data2]) 解决它们

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-14
    • 2017-06-05
    • 2018-03-12
    • 2022-01-22
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    相关资源
    最近更新 更多