javascript - Bluebird 中未处理的拒绝

标签 javascript bluebird

我有以下代码。当 f2 没有抛出错误时,它工作正常。

如果有错误,它会生成一个Unhandled rejection Error

重写代码以避免 Unhandled rejection Error 并将其正确传播到 f1 中的 catch 的正确方法是什么?

let Bluebird = require('bluebird'),
    mkdirp = Bluebird.promisify(require('mkdirp')),
    request = Bluebird.promisify(require('request')),
    writeFile = Bluebird.promisify(require('fs').writeFile);

function f1() {
    .........
    f2(path, fileName, options).then(.....).catch(....); 
}

function f2(path, fileName, options) {
    p = mkdirp(path).then(request(options).then(res => {
        if (res[0].statusCode === 200) {
            writeFile(fileName, res[0].body);
            return res[0].body;
        } else {
            throw new Error(res[0].statusCode + ': ' + res[0].body);
        }
    }));
    return p;
}

最佳答案

问题是您将 promise 传递给 f2 中的 .then().then() 会忽略任何不是函数的东西,所以 f2 真正返回的是 mkdirp(this.path) 由于某些原因,这是一个大错误。如果在 request(options)then 处理程序中抛出错误,则不会有任何处理。

此外,您没有采取任何措施来处理 writeFile 可能出现的错误。如果您调用 writeFile,您需要返回包含它的 promise 链,或者添加逻辑以在 f2 中处理它。

因为看起来你可以在这里并行运行 mkdirp()request(),但你没有使用 mkdirp() 我会说这是要走的路:

function f2(path, fileName, options) {
    var p = mkdirp(path).return(request(options)).then(res => {
        if (res[0].statusCode === 200) {
            return writeFile(fileName, res[0].body)
            .return(res[0].body);
        } else {
            throw new Error(res[0].statusCode + ': ' + res[0].body);
        }
    });
    return p;
}

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

相关文章:

javascript - 如何在 Bluebird 中捕捉 ENOENT?

javascript - 设置默认日期 Bootstrap Datepicker

javascript - 无法使用 jQuery click() 打开链接

javascript - 当使用 FromEvent RxJS 和 Angular 订阅输入标签值更改时,如何避免使用 'any'?

node.js - 从异步等待函数中获取 Bluebird Promise

node.js - 使用 Promise 进行流量控制

javascript - Q Promise 等效于 BlueBird Promise.Bind()

javascript - 从自定义函数返回 promise

javascript - amcharts 的问题

javascript - 如果对象键存在,则向其中添加另一个对象