Loopback异步数据调用Nodejs

时间:2016-05-21 17:43:32

标签: node.js loopback

我有返回最新剧集发行的节目列表的方法,全部返回剧集的总数。 我有点卡在循环部分,我需要计算结果数组中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);
    });
});

1 个答案:

答案 0 :(得分:1)

这里要指出的一些事情。 show被定义为空数组,但后来在查询server.models.Eps.count({'show_id': show.id},function (err,value) {中引用了id。 我认为show是剧集数据结构的关键,所以不应该是函数调用? 另外,我不确定您为什么要将Promise.all用于单一承诺。

我想我理解你想要实现的目标。

有几种方法可以做到这一点,一种需要最少的改变,一种可能被认为更好。

  1. 您可以使用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();
      });
    });
    
  2. 您可以做的另一件事是将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;
    }