[英]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.