Async for Array问题

时间:2015-11-19 18:54:48

标签: javascript mongodb asynchronous

我一直指向使用async模块,但我不太确定如何使用瀑布来解决我的问题。

我的原始代码存在异步性问题。

        var Image    = require('./models/image');
        var User     = require('./models/user');

        var query = Image.find({});

        query.limit(10);
        query.sort('-date')

        query.exec(function (err, collected) {
          if (err) return console.error(err);
            var i = 0;
            var authors = [];

            while (i < 8) {
                var search = User.find({'twitter.id' : collected[i].author});


                search.exec(function (err, user){
                    if (err) return console.error(err);

                    var result = (user[0].twitter.username);
                    authors.push(result);
                });

                i = i + 1;
            }
        }

        console.log(authors);

我希望authors数组包含所有找到的用户名。但是,当最后一次console.log()调用返回'[]'

1 个答案:

答案 0 :(得分:1)

因此,您希望等待所有搜索首先完成。您应该将所有异步调用放入一个数组中,然后使用异步库将它们链接在一起(瀑布)或同时执行(并行)。并行倾向于执行“更快”:

var searches = [];
while (i < 8) {
    var search = User.find({'twitter.id' : collected[i].author});
    searches.push(function(cb) {
        search.exec(function (err, user){
            if (err) cb(err, null);
            else cb(null, user[0].twitter.username);
        });
    });
    i++;
}
async.parallel(searches, function( err, authors ) {
    if ( err ) return console.error( err );
    console.log(authors);
    // Authors only defined here.
    //  TODO: More code
});
// Authors not defined here.