Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.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 JS承诺-为什么我会看到未处理的PromisejectionWarning和DeprecationWarning?_Javascript_Node.js_Promise_Es6 Promise - Fatal编程技术网

Javascript JS承诺-为什么我会看到未处理的PromisejectionWarning和DeprecationWarning?

Javascript JS承诺-为什么我会看到未处理的PromisejectionWarning和DeprecationWarning?,javascript,node.js,promise,es6-promise,Javascript,Node.js,Promise,Es6 Promise,我正在着手处理承诺以及如何设置它们,但是我不明白为什么node在遇到错误时认为我的承诺没有得到处理。。。有人能解释一下吗 我的简单代码 //建立承诺 函数添加(x,y){ 返回新承诺((响应,拒绝)=>{ //简单条件(不是完美的,但它只是证明了一点) 如果(x!==null&&y!==null){ //我知道我本可以做“回应(x+y)”,但我想 //还要记录结果 变量计算=x+y 响应(计算) console.log('计算:'+x++'+y++'='+calc) }否则{ //我的控制台没

我正在着手处理承诺以及如何设置它们,但是我不明白为什么node在遇到错误时认为我的承诺没有得到处理。。。有人能解释一下吗

我的简单代码

//建立承诺
函数添加(x,y){
返回新承诺((响应,拒绝)=>{
//简单条件(不是完美的,但它只是证明了一点)
如果(x!==null&&y!==null){
//我知道我本可以做“回应(x+y)”,但我想
//还要记录结果
变量计算=x+y
响应(计算)
console.log('计算:'+x++'+y++'='+calc)
}否则{
//我的控制台没有抛出此错误?
拒绝('其中一个输入为空')
}
})
}
//使用承诺的功能
函数计算(){
加(1、3)
。然后(res=>add(res,3))
。然后(res=>add(res,null))
.then(res=>console.log('最终结果:'+res))
.catch(错误=>{
//此错误在控制台中抛出
抛出新错误(“出现了严重错误”)
})
}
//运行代码

计算()

// Function using the Promise
function calc() {
    add(1, 3)
        .then(res => add(res, 3))
        .then(res => add(res, null))
        .then(res => console.log('Final result: '+res))
        .catch(err => {
            // This error is thrown in console
    --->    throw new Error('Something went horribly wrong')
        })
}
-->
生成的行抛出错误。这个错误没有被发现。通常,当你发现一个错误时,你想对它做点什么。如果您将其抛出或抛出另一个错误,则应捕获该抛出

我要做的是:

// Function using the Promise
function calc() {
    return add(1, 3)
        .then(res => add(res, 3))
        .then(res => add(res, null))
        .then(res => console.log('Final result: '+res))
        .catch(err => {
            // This error is thrown in console
            throw new Error('Something went horribly wrong')
        })
}

calc().catch(err => {
    console.log(error.message); // For example
});

您正在调用
reject
并抛出一个错误。你只需要做其中一个

您没有显示第一条错误消息

调用
add
时,对于任何抛出的错误,使用
.catch
也很重要

执行此操作时:
抛出新错误(“出现了可怕的错误”)
你仍然在一个
承诺中
,如果你没有抓住它,你就是在制造问题。在Node.js的未来版本中,这将导致应用程序退出并返回错误代码。因此,您需要确保始终捕获承诺中抛出的错误

使用拒绝

//建立承诺
函数添加(x,y){
返回新承诺((响应,拒绝)=>{
//简单条件(不是完美的,但它只是证明了一点)
如果(x!==null&&y!==null){
//我知道我本可以做“回应(x+y)”,但我想
//还要记录结果
变量计算=x+y
响应(计算)
console.log('计算:'+x++'+y++'='+calc)
}否则{
//我的控制台没有抛出此错误?
拒绝(新错误('其中一个输入为null'))
}
})
}
//使用承诺的功能
函数计算(){
返回添加(1,3)
。然后(res=>add(res,3))
。然后(res=>add(res,null))
.then(res=>console.log('最终结果:'+res))
.catch(错误=>{
控制台错误(“内部错误:”,错误消息);
//此错误在控制台中抛出
抛出新错误(“出现了严重错误”)
})
}
//运行代码
计算()捕获((错误)=>{
控制台错误(“外部错误:”,错误消息);

});
如果在
catch
子句中抛出新错误,它将沿着承诺链传播。因此,您需要第二个
catch
来捕获在第一个catch中抛出的错误。您可能只想在抛出它的内部返回reject子句中的字符串,因为您在reject中返回的内容将用作catch中的错误。谢谢@Shilly-我已经编辑了我的问题。我理解你所说的抛出的错误需要被捕获的意思,但是如果我没有抛出任何东西,只是让
reject('some error message')
?我没有在我的控制台中看到错误消息?@Shilly-啊,我知道
reject()
部分与
response()
部分一样,它需要传递或调用一些东西。放入
reject(console.log('Rejection message'))
失败时会打印到控制台,但是我仍然收到
未处理的PromisejectionWarning:Unhandled promise Rejection
您仍然会在未处理的捕获中抛出错误。编辑后,
err
inside
catch
等于“其中一个输入为空”,因为这就是您拒绝承诺的原因。因此,如果您需要将这两件事都记录到控制台,只需将
catch
处理程序更改为
console.error(err);console.error(‘发生了可怕的错误’)
因此被拒绝的文本和catch中的文本都被记录下来。由于这是最后一个catch处理程序,您希望在那里结束错误链。是否有任何方法可以使用
reject()
部分,这样我就不必在
calc()
的末尾添加
catch()
?我将行更改为
reject(console.log('some error')
,并将其打印到控制台上,但仍带有弃用错误,但更改为
reject(new error('some message'))
没有做任何事情……如果使用
reject()
,则必须
catch()
拒绝。但没有什么能阻止您记录错误而不拒绝。