node.js - 承诺永远不会解决 - NodeJS
问题描述
我做了以下循环,我循环一个数组;然后为每个人做一个快速的 GET 请求。
我使循环工作并且正确记录了数据。然而,“循环”永远不会结束,因此没有达到().then => {}
Promise.all(
arr.map((key,item) => {
return new Promise((resolve,reject) => {
var costmicro = 0;
request.post({
url: 'https://googleads.googleapis.com/v8/customers/'+arr[item]+'/googleAds:searchStream',
headers: {
'Content-Type': 'application/json',
},
json: {
"query": "SELECT metrics.cost_micros FROM campaign WHERE segments.date DURING LAST_30_DAYS",
}
}, function (errAdsCampaign, httpResponseAdsCampaign, bodyAdsCampaign) {
if (!errAdsCampaign) {
for (ii in bodyAdsCampaign[0].results) {
costmicro = costmicro+parseInt(bodyAdsCampaign[0].results[ii].metrics['costMicros']);
var arrlength = bodyAdsCampaign[0].results.length-1;
if (ii == arrlength) {
objectArray.push({name: arr[item], cost: costmicro / 1000000});
resolve(objectArray);
}
}
} else {
reject();
}
});
});
})
).then(()=>{
console.log('done');
console.log(objectArray)
}).catch(() => {
console.error;
});
更新替换了 catch() 函数。像这样;遗憾的是它永远不会返回错误,也永远不会完成
}).catch((e) => {
console.error(e);
});
任何帮助深表感谢!
解决方案
在循环内的函数内部,您需要考虑所有可能的退出路径并调用resolve()
或reject()
。一种未处理的退出路径是 ifbodyAdsCampaign[0].results
是空数组或未定义。在这种情况下,该函数将在不调用resolve()
or的情况下完成运行reject()
。
您还可以在回调函数reject()
的末尾添加一个调用,function (errAdsCampaign, httpResponseAdsCampaign, bodyAdsCampaign)
以捕获函数中未处理的所有场景。
推荐阅读
- r - 使用 ggplot2 和 grid.arrange 均衡多图图中的面板高度
- c++ - std::cout 内的三元条件运算符
- python - 根据Python中的索引列表从位数组中提取位?
- javascript - Outlook 加载项中是否有取消会议功能,例如发送时
- python - 为什么 TensorFlow 2.1 不能识别我的 GPU?
- swift - 错误:执行被中断,原因:信号 SIGABRT。在快速的操场上
- vue.js - nginx反向代理背后的Nuxt.js应用程序一次加载多个页面
- sequelize.js - 如何根据续集模型的数组类型属性进行选择?
- python - Python列表元素交换未按预期工作
- symfony - Symfony 3.4 - 使用数组作为输入字段的名称