javascript for循环中的异步函数

javascript for循环中的异步函数,javascript,node.js,asynchronous,express,Javascript,Node.js,Asynchronous,Express,我试图将从数据库获取的数据插入一个json变量,然后将其发送到客户端,问题是,由于我异步获取数据库中的所有数据,我不知道json何时正确填充 var geojson={ "type": "FeatureCollection", "features": [] }; var routeObjects=JSON.parse(route.route); for(var i=0;i<routeObjects.length;i++){ hostel

我试图将从数据库获取的数据插入一个json变量,然后将其发送到客户端,问题是,由于我异步获取数据库中的所有数据,我不知道json何时正确填充

var geojson={ "type": "FeatureCollection",
              "features": []
    };

var routeObjects=JSON.parse(route.route);
for(var i=0;i<routeObjects.length;i++){
        hostelery.getInfo(routeObjects[i].ID, function(err, hostelery){
            if(!err) geojson.features.push(hostelery);
        });
}
var geojson={“类型”:“FeatureCollection”,
“功能”:[]
};
var routeObjects=JSON.parse(route.route);

对于(var i=0;i,如果您真正想做的是知道何时完成了一系列异步操作,那么有多种方法来解决这个问题

一种方法是简单地在所有异步操作完成时保留一个计数,然后在该计数达到其终值时执行您想要执行的任何操作:

var geojson = {
    "type": "FeatureCollection",
    "features": []
};

var doneCount = 0;
var routeObjects = JSON.parse(route.route);
for (var i = 0; i < routeObjects.length; i++) {
    hostelery.getInfo(routeObjects[i].ID, function (err, hostelery) {
        if (!err) geojson.features.push(hostelery);
        ++doneCount;
        if (doneCount === routeObjects.length) {
            // all async operations are done now
            // all data is in geojson.features
            // call whatever function you want here and pass it the finished data
        }
    });
}
然后,您可以使用
Promise.all()


因为看起来您使用的是node.js,所以也有许多异步库提供了管理异步操作的各种功能。就是这样一个库。

这应该会非常有帮助,非常感谢,我终于用async.js库完成了,非常感谢!非常棒的一个人在浏览了数千篇文章后,终于发现了有用的东西一个@JFriend00添加了承诺实现。
hostelery.getInfoAsync = function(id) {
    return new Promise(function(resolve, reject) {
        hostelery.getInfo(id, function(err, data) {
            if (err) return reject(err);
            resolve(data);
        });
    });
}
var geojson = {
    "type": "FeatureCollection",
    "features": []
};

var routeObjects = JSON.parse(route.route);
Promise.all(routeObjects.map(function(item) {
    return hostelery.getInfoAsync(item.ID).then(function(value) {
        geojson.features.push(value);
    }).catch(function(err) {
        // catch and ignore errors so processing continues
        console.err(err);
        return null;
    });
})).then(function() {
    // all done here
});