node.js - Loopback异步数据调用Nodejs

标签 node.js loopback

我有返回最新剧集发布的节目列表的方法,所有这些都返回剧集总数。 我有点陷入循环部分,我需要计算结果数组中所有节目的剧集,因为查询调用是异步的,我无法同步它们。如果能为这个问题提出解决方案就太好了

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 。

我想我明白你想要实现的目标。

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

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

相关文章:

javascript - 如何在 Loopback 4 中查看文件更改?

javascript - 如何异步调用 3 个请求?

node.js - 在 Selenium Grid 上运行 WebdriverJS 测试

loopbackjs - 环回 4 和 Mongodb : All model's id are null on response

node.js - Nodejs Loopback 4 将不记名 token 配置添加到 swagger 资源管理器中

postgresql - 如何通过 SSL 连接到 Loopback v3 中的 Postgres

node.js - Sequelize 唯一约束错误: Validation error

node.js - Memcached 无法连接到远程服务器 | memcached.js

javascript - 将一组函数异步到数组

android - 在设备上本地使用 ADB(环回)显示没有设备