我有返回最新剧集发行的节目列表的方法,全部返回剧集的总数。 我有点卡在循环部分,我需要计算结果数组中show的所有剧集,因为查询调用是异步的,我无法同步它们。能够建议解决这个问题的方法很棒
server.models.Eps.find({
include:'show',
order: 'dateadded DESC',
limit: 10 },function (err,episodes) {
if(err)
{ console.log(err);
return res.sendStatus(500);
}
var show = [];
var p1 = new Promise(function (resolve,reject) {
for(var i = 0; i < episodes.length;i++)
{
var sh = episodes[i].show();
server.models.Eps.count({'show_id': show.id},function (err,value) {
if(err) {
console.log(err);
return res.statusCode(500);
}
console.log(value);
sh.episodeCounts = value;
show.push(sh);
});
}
});
Promise.all([p1])
.then(function (values) {
return res.send(show);
});
});
答案 0 :(得分:1)
这里要指出的一些事情。 show
被定义为空数组,但后来在查询server.models.Eps.count({'show_id': show.id},function (err,value) {
中引用了id。
我认为show是剧集数据结构的关键,所以不应该是函数调用?
另外,我不确定您为什么要将Promise.all
用于单一承诺。
我想我理解你想要实现的目标。
有几种方法可以做到这一点,一种需要最少的改变,一种可能被认为更好。
您可以使用async库以异步方式迭代数组。它应该工作正常,但以这种方式混合回调和承诺并不是很好(我的个人观点:))
var async = require( "async" );
var shows = [];
async.each( episodes, function( episode, cb ){
var show = episode.show;
server.models.Eps.count({'show_id': show.id},function(err,value) {
if(err) {
console.log(err);
cb( err );
}
console.log(value);
show.episodeCounts = value;
shows.push(sh);
},
function( err ){
if( err ){
return res.statusCode(500);
}
else callback();
});
});
您可以做的另一件事是将server.models.Eps.count
函数包装在一个返回promise的包装器中。这样你就可以使用更多的promise-ish方法来处理异步调用。类似的东西:
server.models.Eps.find({
include:'show',
order: 'dateadded DESC',
limit: 10 },function (err,episodes) {
if(err){
console.log(err);
return res.sendStatus(500);
}
var promises = [];
for(var i = 0; i < episodes.length;i++)
var show = episodes[i].show;
promises.push( appendEpisodeCount( show ) );
}
Promise.all( promises )
.then(function( shows ) {
return res.send( shows );
})
.catch( function( err ){
res.statusCode( 500 );
});
});
function appendEpisodeCount( show )
var promise = new Promise( function( resolve, reject ){
var query = {
show_id: show.id
};
server.models.Eps.count( query,function(err,value) {
if( err ) return reject( err );
show.episodeCount = value;
resolve( show );
});
});
return promise;
}