Loopback异步数据调用Nodejs
Loopback Async data call Nodejs
我有方法 return 发布最新剧集的节目列表,所有 return 总剧集数。
我有点卡在循环部分,我需要计算结果数组中所有节目的剧集,因为查询调用是异步的,我无法同步它们。如果能提出解决这个问题的建议就好了
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
作为一个承诺。
不过我想我理解你想要实现的目标。
有几种方法可以做到这一点,一种需要最少的更改,另一种可能会被认为更好。
您可以使用 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
函数包装在 returns 承诺的包装器中。这样您就可以使用更有希望的方法来处理异步调用。类似于:
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;
}
我有方法 return 发布最新剧集的节目列表,所有 return 总剧集数。 我有点卡在循环部分,我需要计算结果数组中所有节目的剧集,因为查询调用是异步的,我无法同步它们。如果能提出解决这个问题的建议就好了
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
作为一个承诺。
不过我想我理解你想要实现的目标。
有几种方法可以做到这一点,一种需要最少的更改,另一种可能会被认为更好。
您可以使用 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
函数包装在 returns 承诺的包装器中。这样您就可以使用更有希望的方法来处理异步调用。类似于: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; }