我有一种方法可以返回最新剧集发布的节目列表,这些方法都可以返回剧集的总数。我有点陷入循环部分,我需要计算结果数组中所有节目的节目,因为查询调用是异步的,我无法合成它们。很好,可以为这个问题提供解决方案
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);
});
});
这里要指出几点。show
被定义为空数组,但随后在查询中引用ID server.models.Eps.count({'show_id': show.id},function (err,value) {
。我认为show是情节数据结构上的关键,因此不应该作为函数调用吗?另外,我不确定您为什么要使用Promise.all
一个单一的承诺。
我想我了解您正在努力实现的目标。
您可以通过两种方法来完成此操作,一种方法需要最少的更改,而另一种方法可能会被认为更好。
您可以使用异步库异步遍历数组。它应该可以正常工作,但是以这种方式混合回调和promise不是很好(我个人认为:))
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的包装器中。这样一来,您可以使用一种更具前景的方法来处理异步调用。就像是:
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;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句