在nodejs中添加异步结果到数组
Add async result to array in nodejs
我是相当新的Node.js和它的生命,我似乎不能弄清楚整个回调异步的事情。
我想要实现的是"相对"简单,如果它所有的阻塞调用。
1)请求一个列表
2)遍历元素3)为新列表创建新元素,新元素属性为另一个请求的结果
细节:
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);
});
});
我省略了第二个异步函数,它也使谷歌地图请求,并应将该结果也添加到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');
});
如果只有一个任务,就不需要async.parallel()
我认为你的代码应该像下面
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(null, 'success');
} else {
callback(err);
}
});
}
], function(err, results) {
if (err) console.log(err);
newList.push(newElement);
});
});
async。并行API文档,if (!err)
中的callback()
必须为callback(err, results)
相关文章:
- 如何实现基于两个数组创建结果数组的逻辑
- 无法获取所需的结果数组
- 动态结果数组需要使用 Angular JS 与不同布局的表绑定
- 如何从谷歌地图API返回的结果数组中提取城市名称
- 如何查询具有特定 id 的 json 文件并获取结果数组
- 如何将谷歌放置 API 结果数组与淘汰赛集成
- 是否保证 document.querySelectorAll(“input[type=checkbox”) 的结果数组的
- 如何使用 Parse.promise javascript 定义一个承诺数组并获取结果数组 [parse.com]
- HTML5 语音 API - 重置结果数组
- 如何访问在 ajax 中返回的结果数组
- 输出一个结果数组,其中包含给定数组的唯一元素的分组计数
- Javascript返回基于日期的平均测试结果数组
- NodeJS ExpressJS如何打印API结果数组
- 在添加到结果数组之前,请检查值是否存在
- 为什么String.match在结果数组中返回重复项
- 如何合并两个只有唯一或不同值的复杂JSON对象,这些值只显示在结果数组中
- Javascript -根据字符拆分字符串,但将其保留在结果数组中
- Javascript, array concat将Windows Object添加到结果数组中,但它不适用于Firefo
- 如何分割正则表达式空间和标点匹配,但保留结果数组中的标点符号
- 尝试从json树状结构JavaScript递归创建一个结果数组