我有一个看起来像这样的对象数组:
[ { 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的异步特性,因此无法正常工作。 谁能给我看一个简短,简单的函数来满足我的需求?
答案 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');
});