【问题标题】:Asynchronous function inside a javascript for loopjavascript for循环中的异步函数
【发布时间】:2014-07-09 09:33:20
【问题描述】:

我正在尝试将从数据库获取的数据插入到 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);
        });
}

所以当所有数据都在 geojson 中时,我想将其发送回客户端...

任何帮助将不胜感激......

非常感谢。

【问题讨论】:

标签: javascript node.js asynchronous express


【解决方案1】:

如果您真的只是想知道一堆异步操作何时完成,那么有多种方法可以解决问题。

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

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
        }
    });
}

如果您的 API 支持承诺,或者您可以“承诺”API 以使其支持承诺,那么promises 是一种更现代的方式,可以在一个或多个异步操作完成时获得通知。这是一个承诺的实现:

首先,promisify 异步操作:

hostelery.getInfoAsync = function(id) {
    return new Promise(function(resolve, reject) {
        hostelery.getInfo(id, function(err, data) {
            if (err) return reject(err);
            resolve(data);
        });
    });
}

然后,你可以用Promise.all()

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
});

由于您使用的是 node.js,因此还有许多异步库提供了用于管理异步操作的各种功能。 Async.js 就是这样一个库。

【讨论】:

  • 非常感谢,终于用Async.js库搞定了,非常感谢!
  • 优秀的一个人终于在浏览了数千篇帖子后,我找到了一个有用的@jfriend00
  • 添加了承诺实现。
猜你喜欢
  • 1970-01-01
  • 2017-12-16
  • 2012-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-07
  • 2018-09-24
  • 1970-01-01
相关资源
最近更新 更多