我有以下代码。当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;
}
答案 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;
}