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

Add async result to array in nodejs

本文关键字:结果 数组 异步 添加 nodejs      更新时间:2023-09-26

我是相当新的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)