我有返回最新剧集发布的节目列表的方法,所有这些都返回剧集总数。 我有点陷入循环部分,我需要计算结果数组中所有节目的剧集,因为查询调用是异步的,我无法同步它们。如果能为这个问题提出解决方案就太好了
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
被定义为空数组,但随后在查询 server.models.Eps.count({'show_id': show.id},function (err,value) {
中引用 id。
我认为 show 是剧集数据结构的关键,所以不应该是函数调用?
另外,我不确定您为什么使用 Promise.all
来实现单个 promise 。
我想我明白你想要实现的目标。
有几种方法可以做到这一点,一种需要最少的更改,另一种可能会被认为更好。
您可以使用async用于异步迭代数组的库。它应该可以正常工作,但是以这种方式混合回调和 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; }
关于node.js - Loopback异步数据调用Nodejs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37366213/