javascript - forEach 未处理的拒绝错误

标签 javascript node.js promise bluebird

我正在尝试使用 forEach 迭代数组时处理拒绝。 这就是问题所在:

module.exports = function (alert, level, subscribers, tagSubscribers, message_type) {
    return decrypt(config.slack_bot_token)
        .then(function (auth_token) {
            console.log('Dispatch got the token from kms');
            subscribers.forEach(function(subscriber){
                return makePostCall(alert, level, subscriber, tagSubscribers, message_type, auth_token);
            });
        })
        .catch(function (error) {
            console.error('Error during dispatch: ' + error);
            throw new Error(error);
        });
};

makePostCall 返回 resolvereject 并沿着这些线路查找内容...

function makePostCall(alert, level, subscriber, tagSubscribers, message_type, auth_token) {
    return new Promise(function (resolve, reject) {
        const headers = ...
        const url = ...
        var payload = ...

        request.post({
            url: url,
            headers: headers,
            form: payload
        }, function (error, response, body) {
            if (!error && response.statusCode === 200 && JSON.parse(body).ok === true) {
                console.log('successfully published to Slack');
                return resolve();
            }
            else if (!error && response.statusCode === 200 && JSON.parse(body).ok === false) {
                console.error('Status is 200 but ok is false: ' + JSON.stringify(body));
                return reject(new Error(JSON.stringify(body)));
            }
            else {
                console.error('Status other than 200: ' + JSON.stringify(error));
                return reject(new Error(JSON.stringify(error)));
            }
        });
    });
}

现在在运行单元测试时,我遇到了很多未处理的拒绝错误

Unhandled rejection Error: {"status":404,"statusCode":404}
    at Request._callback (/Users/alnu/IdeaProjects/meghaduta-alerter-slack-lambda/lib/dispatchAlert.js:63:31)
    at self.callback (/Users/alnu/IdeaProjects/meghaduta-alerter-slack-lambda/node_modules/request/request.js:188:22)
    at emitOne (events.js:96:13)
    at Request.emit (events.js:188:7)
    at Request.onRequestError (/Users/alnu/IdeaProjects/meghaduta-alerter-slack-lambda/node_modules/request/request.js:884:8)
    at emitOne (events.js:96:13)
    at OverriddenClientRequest.emit (events.js:188:7)
    at /Users/alnu/IdeaProjects/meghaduta-alerter-slack-lambda/node_modules/nock/lib/request_overrider.js:212:11
    at _combinedTickCallback (internal/process/next_tick.js:73:7)
    at process._tickDomainCallback (internal/process/next_tick.js:128:9)

作为引用,我正在使用 Bluebird for Promises。 我对 Node 和 Promise 还很陌生。试图使用 async/await 来避免这种困惑,但 Node6.10 尚不支持。

最佳答案

事实上,没有人倾听 promise ;他们只是被扔掉了。将 promise 包装在 Promise.all() 中应该可以解决您的问题。

module.exports = function (alert, level, subscribers, tagSubscribers, message_type) {
    return decrypt(config.slack_bot_token)
        .then(function (auth_token) {
            console.log('Dispatch got the token from kms');
            return Promise.all(subscribers.map(function(subscriber){
                return makePostCall(alert, level, subscriber, tagSubscribers, message_type, auth_token);
            }));
        })
        .catch(function (error) {
            console.error('Error during dispatch: ' + error);
            throw new Error(error);
        });
};

关于javascript - forEach 未处理的拒绝错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46238486/

相关文章:

javascript - 面对超过 2000 个项目时,Dynatree 返回错误

javascript - 如何按升序对 JavaScript 中的嵌套数组进行排序?

javascript - 使用 continuation-local-storage 时如何解决 promise ?

node.js - Apollo服务器网络错误: unable to reach server

angularjs - 来自多个 promise 的增量 UI 更新

javascript - 在下一个请求之前等待 $http promise

javascript - 数字javascript的数字总和

javascript - 强制 eslint 在某些文件上导入时使用默认导出模块的原始名称

node.js - ClojureScript (nodejs) 返回文件字符串内容的函数

javascript - Web Worker 与 Promise