在promise.all中Javascript变量变得未定义

时间:2018-02-01 14:51:35

标签: javascript node.js amazon-web-services promise elastic-beanstalk

我有一个Node.js应用程序,它将来自外部CRM的客户端数据同步到应用程序数据库。

应用程序每半小时触发一次CRON作业,并基本上通过CRM的API提取客户端数据。这个“同步”代码必须进行非常大量的调用才能收集所需的所有数据。

使用promises进行API调用通常使用Promise.all函数在异步庄园中执行多个promise。

我的代码的简化部分如下所示。 promise.all方法用于为我的数据库中的每个客户端调用 processReferrals 方法

return db.entities.clients.findAll({ where: {company: company.id}}).then((theClients) => {

        var changes = [];

          var rPromises = [];

          theClients.forEach(client => {
            rPromises.push(CharityLogService.processReferrals(client,company));
          });
          return Promise.all(rPromises).then((values) => {
            values.forEach(v => {
              changes.push(v);
            });
            return changes;
          });
      })
      .catch(function (err) {
          return [];
      });

processReferrals 方法本身然后调用外部API以返回“引用”数据。每个引用都有多个'actions',所以这个方法也有嵌套调用另一个方法,再次通过Promises.all

processReferrals: function(client,company) {

  var options = {
  uri: "https://externalapi.com/getclientreferrals" + client.id,
  headers: {
    'company': company.id
  },
  json: true
  };

  var actionPromises = [];

  return server.httprequest(options)
  .then(function (referrals) {

  referrals.forEach(referral => {

    actionPromises.push(Service.ActionPromiseMethod(referral.id,company));
  })

  return Promise.all(actionPromises).then((actiondata) => {
        return actiondata;
      });
})
.catch(function (err) {

  console.log('ERROR: api fail error: " + err);

  var changes = {};
  return new Promise((resolve, reject) => {
    changes.clientId = client.id;

    console.log("returning changes API FAIL..");
    resolve(changes);
  });

});
}

这种方法在具有相当少量数据的开发环境中运行良好。但是,当它被部署到具有大量数据的实时环境(以及随后的更多API调用)时,我遇到了问题。

代码似乎间歇性地工作,成功返回某些客户端的数据,然后失败并显示其他错误消息

  

错误:api失败错误:客户端未定义

我有点疑惑客户端对象如何在此处变为未定义。

我正在AWS Elastic Beanstalk(EC2)上托管我的应用程序。我不完全确定这是一个代码问题,因为结果是间歇性的,并且在开发环境中100%成功。

由于需要在实时环境中进行大量调用,我的AWS实例是否需要升级/升级?

这里有任何指示都很棒。

0 个答案:

没有答案