Javascript变量在promise.all中未定义
我有一个Node.js应用程序,它将外部CRM中的客户端数据同步到by applications数据库中 该应用程序每半小时触发一个CRON作业,并基本上通过CRM的API读取客户机数据。此“同步”代码必须进行大量调用才能收集所需的所有数据 对API的调用使用Promission进行,通常使用Promission.all函数在异步manor中执行多个Promission 我的代码的简化部分如下所示。promise.all方法用于为数据库中的每个客户端调用processReferrals方法Javascript变量在promise.all中未定义,javascript,node.js,amazon-web-services,promise,amazon-elastic-beanstalk,Javascript,Node.js,Amazon Web Services,Promise,Amazon Elastic Beanstalk,我有一个Node.js应用程序,它将外部CRM中的客户端数据同步到by applications数据库中 该应用程序每半小时触发一个CRON作业,并基本上通过CRM的API读取客户机数据。此“同步”代码必须进行大量调用才能收集所需的所有数据 对API的调用使用Promission进行,通常使用Promission.all函数在异步manor中执行多个Promission 我的代码的简化部分如下所示。promise.all方法用于为数据库中的每个客户端调用processReferrals方法 re
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以返回“referral”数据。每个引用都有多个“操作”,所以这个方法也有对另一个方法的嵌套调用,同样是通过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实例是否需要升级
这里的任何指针都很好。为什么要使用
.forEach
。通过使用.map
,您可以大大简化代码。承诺。所有
结果不需要映射,您可以直接返回它。请整理代码并使用.map
至于错误,客户端未定义
并不意味着客户端是未定义
,而是它未声明。。。。检查您是否尝试访问服务中的客户端
。ActionPromiseMethod
谢谢您的评论。我同意。map可以在我的代码中的一些地方使用。但是,它仍然不是未声明的“客户端”变量问题的原因。实际上,我没有在Service.ActionPromiseMethod方法中的任何地方使用“client”变量,因此我对错误消息感到困惑。