gpt4 book ai didi

javascript - 在nodejs中将异步结果添加到数组

转载 作者:行者123 更新时间:2023-12-03 05:48:56 26 4
gpt4 key购买 nike

我对 Node.js 相当陌生,从它的生命周期来看,我似乎无法弄清楚整个回调异步的事情。

如果一切都阻塞调用,我想要实现的目标是“相对”简单。

1) 请求列表

2)迭代元素

3)为新列表创建新元素,新元素属性是另一个请求的结果

4) 将新元素添加到新列表

具体内容:

var originalList = [{
provider: "ABC",
loc: [13.37224, 52.53862],
state: 22
}, {
provider: "CDE",
loc: [13.37124, 52.53262],
state: 33
}, {
provider: "EFG",
loc: [13.37214, 52.53662],
state: 44
}];

var newElement;
var newList = [];
var vLat, vLng;

originalList.forEach(function(element, index, array) {

newElement = {
provider: element.provider,
state: element.state
};
vLat = element.loc[1];
vLng = element.loc[0];

async.parallel([
function(callback) {
var location;
googleMapsClient.reverseGeocode({
latlng: [vLat, vLng],
result_type: ['street_address'],
location_type: ['ROOFTOP', 'APPROXIMATE']
}, function(err, response) {
if (!err) {
var result = response.json.results;
location = result[0].formatted_address;
newElement.location = location;
callback();
} else {
callback(err);
}
});
}
], function(err) {
if (err) console.log(err);
newList.push(newElement);
});
});

我省略了第二个异步函数,它也发出 Google map 请求,并且应该将该结果也添加到 newElement 中。

我真的很困惑为什么 newElement 没有获得新属性(newElement.location)。我知道这将是基本的。

最佳答案

循环也需要异步才能控制处理所有项目的流程。使用 async.each() 或 async.eachSeries() (依次处理列表):

var originalList = [{
provider: "ABC",
loc: [13.37224, 52.53862],
state: 22
}, {
provider: "CDE",
loc: [13.37124, 52.53262],
state: 33
}, {
provider: "EFG",
loc: [13.37214, 52.53662],
state: 44
}];

var newList = [];

async.each(originalList, function (element, eachCb) {

var newElement = {
provider: element.provider,
state: element.state
};
var vLat = element.loc[1];
var vLng = element.loc[0];

async.parallel([
function(callback) {
var location;
googleMapsClient.reverseGeocode({
latlng: [vLat, vLng],
result_type: ['street_address'],
location_type: ['ROOFTOP', 'APPROXIMATE']
}, function(err, response) {
if (!err) {
var result = response.json.results;
location = result[0].formatted_address;
newElement.location = location;
callback();
} else {
callback(err);
}
});
}
], function(err) {
if (err) {
console.log(err);
} else {
newList.push(newElement);
}
eachCb(); // <<<<< call to signal it's done!!
});
}, function (err) {
console.log('finish processing all items in originalList');
});

如果只有 1 个任务,则不需要 async.parallel()

关于javascript - 在nodejs中将异步结果添加到数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40225111/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com