Javascript异步在循环内获取请求

时间:2020-01-17 11:30:45

标签: javascript node.js asynchronous

我有一个看起来像这样的对象数组:

[ { firstName: 'Mike', lastName: 'Jones' },
  { firstName: 'Joe', lastName: 'Smith' },
  { firstName: 'Bob', lastName: 'Johnson' } ]

我需要将该数组传递给一个函数,该函数将向每个对象添加一个“ middleName”字段,并为MiddleName设置一个值。该函数通过在Node中发出异步http.get请求来获取中间名。问题就在这里。无论如何尝试,我都无法完成这项工作。

以前有人建议过这样的循环:

array.forEach(function (obj) {
        GetMiddleName(obj, function (person) {
            obj.MiddleName = person;
        });
    });

但是,由于在GetMiddleName函数中调用get的异步特性,因此无法正常工作。 谁能给我看一个简短,简单的函数来满足我的需求?

4 个答案:

答案 0 :(得分:1)

制作一个Promises数组,在该数组上调用Promise.all,然后在每个数组中插入中间名:

const getMiddleNameProm = obj => new Promise((resolve) => {
  GetMiddleName(obj, resolve);
});
Promise.all(arr.map(getMiddleNameProm))
  .then((middleNames) => {
    for (let i = 0; i < middleNames.length; i++) {
      arr[i].MiddleName = middleNames[i];
    }
    // do stuff with populated arr here
  });
});

答案 1 :(得分:0)

这应该有效

let arrData = [ { firstName: 'Mike', lastName: 'Jones' },
  { firstName: 'Joe', lastName: 'Smith' },
  { firstName: 'Bob', lastName: 'Johnson' } ];

  function getMiddleName(arr){
    arr.forEach(ar => {
        //this will be your async request that gets the usrename
        asynRequest.then(person => {
        arr.MiddleName = person;
      });
    });
  }

 getMiddleName(arrData);`

答案 2 :(得分:0)

您需要创建一个诺言数组,然后解决它们。我认为这里的一些答案是正确的,但这更简洁易懂,特别是如果您不熟悉诺言。

let promises = [];

array.forEach(function (item) {
  let promise = new Promise(function (resolve) {
    GetMiddleName(obj, function (person) {
        obj.MiddleName = person;
        resolve();
    });
  });

  promises.push(promise);
});

Promise.all(promises).then(function () {
  // Do something after all values/promises have been resolved
  // If not just leave it at Promise.all(promises)
});

答案 3 :(得分:0)

您可以使用async framework使用async包来处理异步迭代。

使用不带回调功能的async.eachOf(返回诺言)。注意:从3.x版本开始提供。

返回:
一个承诺,如果省略了回调

类型:承诺

const async = require('async');

let items = [
    { firstName: 'Mike', lastName: 'Jones' },
    { firstName: 'Joe', lastName: 'Smith' },
    { firstName: 'Bob', lastName: 'Johnson' }
];

async.eachOf(items, (item, index, callback) => {
    GetMiddleName(item, function (person) {
        item.MiddleName = person;
    })
      .then(result => {

          console.log('this is result:', result);
          callback();
      });
})
.then(() => {
   console.log('All items updated');
});

或者您可以使用如下回调函数来处理它:

async.eachOf(items, (item, index, callback) => {
    GetMiddleName(item, function (person) {
        item.MiddleName = person;
    })
      .then(result => {

          console.log('this is result:', result);
          callback();
      });
},
  (err) => {
    if (err)
        throw new Error(err);
    else
        console.log('All items updated');
  });
相关问题