首页 > 解决方案 > 承诺永远不会解决 - 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);
});

任何帮助深表感谢!

标签: node.jsasynchronouspromise

解决方案


在循环内的函数内部,您需要考虑所有可能的退出路径并调用resolve()reject()。一种未处理的退出路径是 ifbodyAdsCampaign[0].results是空数组或未定义。在这种情况下,该函数将在不调用resolve()or的情况下完成运行reject()

您还可以在回调函数reject()的末尾添加一个调用,function (errAdsCampaign, httpResponseAdsCampaign, bodyAdsCampaign)以捕获函数中未处理的所有场景。


推荐阅读