**我想首先从findepisodecount函数得到结果然后发送响应但它在从函数获得响应之前发送响应。我正在做什么或者我需要使用其他东西以便代码可以完美地工作 **
async.parallel([
/*
* First external endpoint
*/
function(callback) {
Title.title.find({ "primaryTitle" : { $regex: /Dallas$/ } }).limit(10).lean()
.exec(function(err, docs) {
// var document= docs.json();
var document= docs;
for (var i = 0, len = document.length; i < len; i++)
{
// console.log(docs[i].tconst);
if(document[i].titleType!="tvSeries")
{
// console.log(docs[i].titleType);
}
else
{
console.log("tv series");
var valueofi = i ;
Title.findepisodecount(document[valueofi],function(fulldocument)
{
document[valueofi].season = fulldocument;
console.log("cacA");
//outercallback();
});
// console.log(i)
}
}
console.log("helloo");
callback(false, document);
});
}
],
/*
* Collate results
*/
function(err, results) {
if(err) { console.log(err); res.send(500,"Server Error"); return; }
console.log(results);
res.send(results);
//res.send({api1:results[0], api2:results[1]});
}
);
答案 0 :(得分:0)
除非您有更多代码,否则我认为async.waterfall()将是您正在做的更好的用例。原因是你首先要获得标题,然后转换每个标题以包括他们每个人的季节/剧集数。
我们还使用async.mapSeries转换每个标题以包含其季节。
async.waterfall([
function findTitles(callback) {
Title.title
.find({ "primaryTitle" : { $regex: /Dallas$/ }})
.limit(10)
.lean()
.exec(callback);
},
function findSeason(titles, callback) {
// you are iterating over the documents and doing an async operation to convert each title document, use #async.mapSeries()
async.mapSeries(titles, function (title, callback) {
// note the scope of the argument callback: this inner callback is NOT the same as outer callback
// do nothing and skip
if (title.titleType != "tvSeries")
return callback(null, title);
// otherwise
Title.findepisodecount(title, function (season) {
title.season = season;
callback(null, title);
});
// when the iteration is all done, call the outer callback
}, callback);
}
], function (err, titles) {
console.log('err', err);
if (err)
return res.send(500, "Server Error");
console.log('results', titles);
res.send(titles);
});
此外,对于将同步for
与异步操作混合使用时,这是一个很好的read。