繁体   English   中英

蓝鸟中未处理的拒绝

[英]Unhandled rejection in 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;
}

问题是您正在将诺言传递给f2 .then() .then()将忽略不是函数的所有内容,因此f2真正返回的所有内容都是对mkdirp(this.path)的承诺,由于mkdirp(this.path) ,这是一个大错误。 如果在request(options)then处理程序中引发了错误,那么将没有任何东西可以处理。

另外,您没有做任何事情来处理writeFile可能出现的错误。 如果调用writeFile ,则需要返回一个包含它的promise链,或者添加逻辑以在f2处理它。

因为看起来您可以在此处并行运行mkdirp()request() ,但是您没有使用mkdirp()的结果, 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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM