gpt4 book ai didi

javascript - Bluebird 中未处理的拒绝

转载 作者:行者123 更新时间:2023-11-30 17:00:41 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com