蓝鸟未处理的拒绝

时间:2015-03-08 19:45:09

标签: javascript bluebird

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

如果出现错误,则会生成Unhandled rejection Error

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

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;
}

1 个答案:

答案 0 :(得分:2)

问题在于您将承诺传递到.then()中的f2.then()会忽略任何不是函数的内容,因此f2真正返回的所有内容都是mkdirp(this.path)的承诺,并且出于某些原因这是一个很大的错误。如果request(options) then处理程序中出现错误,则无法处理它。

此外,您没有采取任何措施来处理来自writeFile的错误。如果您致电writeFile,您需要返回包含它的承诺链,或添加逻辑以在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;
}