Javascript 蓝鸟的未处理拒绝
我有以下代码。当Javascript 蓝鸟的未处理拒绝,javascript,bluebird,Javascript,Bluebird,我有以下代码。当f2没有抛出错误时,它可以正常工作 如果有错误,它将生成一个未处理的拒绝错误 重写代码以避免未处理的拒绝错误并将其正确传播到f1中的catch,正确的方法是什么 let Bluebird = require('bluebird'), mkdirp = Bluebird.promisify(require('mkdirp')), request = Bluebird.promisify(require('request')), writeFile = Blu
f2
没有抛出错误时,它可以正常工作
如果有错误,它将生成一个未处理的拒绝错误
重写代码以避免未处理的拒绝错误
并将其正确传播到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;
}
问题是您正在将承诺传递到
中。然后()
在f2
中.then()
将忽略任何非函数的内容,因此f2
真正返回的是对mkdirp(this.path)
的承诺,这是一个很大的错误,有几个原因。如果在请求(选项)
的处理程序中抛出一个错误,那么将没有什么可以处理它
此外,您没有采取任何措施来处理来自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;
}
在f2
中,您正在为p
赋值。什么是p
,您如何调用。然后()
在f2
的返回值上,如果它没有返回任何内容?@JLRishe抱歉,我引入了一个错误,对代码进行了精简。现在已经修复。无论如何,在几周后发布的bluebird 3.0中,你会得到一个warning@kyrylkov事实上,bluebird 3.0做到了这一点:)在常见的陷阱中会收到警告,比如将非函数传递到然后。你可以通过克隆和构建librar的3.0分支来检验它。@Kyrykov蓝鸟的理念是非常务实,并支持用户的实际问题。如果您还有任何问题,请随时提问-我们保证在堆栈溢出(如果您的问题处于可接受的状态)上给出答案,请回复,以便bug报告GH和良好的注意。您肯定是客户:)我的错误是由于抛出新错误(res[0].statusCode+':'+res[0].body)造成的代码>,而不是writeFile
。只有在执行f2
中的else
分支时,我才出现错误。@kyrylkov是的,我的修改应该考虑到这两个问题。你试过了吗?是的,我试过了。当抛出新错误(res[0].statusCode+':'+res[0].body)时,它仍然显示代码>被执行。@kyrylkov在这种情况下我不确定。您是完全复制了我的代码,还是将其合并到现有代码中?如果是后者,你能给我们看一下我修改过的更新代码吗(可能在PasteBin中)?检查一下,问题不在于writeFile
。即使在删除它时,else
子句也会导致错误