最后一行以 '[]' 响应
这是因为User.find() 是一个async 调用。所以当你在i = 8时跳出循环,你会在数据返回之前点击console.log(authors)。
另一个问题
当您只需要进行1 调用时,您似乎正在对数据库进行8 单独调用。如果您有一个名为 collected 的数组,您正在循环访问该数组。它看起来像这样。
var collected = [
{ author : "23423423"},
{ author : "23423424"},
{ author : "23423425"},
{ author : "23423426"},
];
您可以使用.map 函数收集所有推特 ID。
var twitterIds = collected.map(function(a){return a.author});
现在twitterIds == ["23423423", "23423424", "23423425", "23423426"]。
然后您可以使用$in 运算符选择twitter.id 的值等于指定数组中的任何值的文档。
然后你可以这样做User.find({ "twitter.id" : {$in : twitterIds}});
它将返回一个包含所有匹配文档的文档,然后您可以对其进行操作。现在您已经减少到1 呼叫而不是8。
用两个选项重构
我会以两种方式之一重构代码:
1) 返回查询
function search(twitterIds){
var query = User.find({ "twitter.id" : twitterIds});
return query;
}
那么你就可以这样使用了:
var searchQuery = search(twitterIds);
searchQuery.exec(function(err,users){
if(err) return console.log(err);
//do something with users..
users.forEach(function(user){
console.log(user.twitter.username);// do something here
});
}
2) 回报承诺
function search(twitterIds){
var promise = User.find({ "twitter.id" : twitterIds}).exec();
return promise;
}
那么你就可以这样使用了:
var promise = search(twitterIds);
promise.then(function(users){
//do something...
}).error(function(err){
console.log(errr);
});
在使用 async 库之前,我会从这里开始,看看这是否能完成工作。