我有以下代码。当 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/