Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 蓝鸟的未处理拒绝_Javascript_Bluebird - Fatal编程技术网

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
子句也会导致错误