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 作为一个承诺。

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

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

  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 函数包装在 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;
    }