Promise reject()导致"Uncaught(in promise)"​​警告

Yev*_*lov 35 javascript catch-block promise es6-promise

reject()调用promise 回调后,Chrome控制台中会显示警告消息"Uncaught(in promise)".我不能围绕它背后的原因,也不知道如何摆脱它.

var p = new Promise((resolve, reject) => {
  setTimeout(() => {
    var isItFulfilled = false
    isItFulfilled ? resolve('!Resolved') : reject('!Rejected')
  }, 1000)  
})

p.then(result => console.log(result))
p.catch(error => console.log(error))
Run Code Online (Sandbox Code Playgroud)

警告:

在此输入图像描述

编辑:

我发现如果onRejected没有向.then(onResolved, onRejected)方法显式提供处理程序,JS将自动提供隐式处理程序.它看起来像这样:(err) => throw err.自动生成的处理程序将依次抛出.

参考:

如果IsCallable(onRejected)`为false,那么
     让onRejected为" Thrower ".

http://www.ecma-international.org/ecma-262/6.0/index.html#sec-performpromisethen

tri*_*cot 33

发生这种情况是因为您没有将catch处理程序附加到第一个then方法返回的promise ,因此在promise拒绝时没有处理程序.你在最后一行中确实有一个承诺p,但是没有因为方法返回的链式承诺then在它之前的行中.

正如您在下面的注释中正确添加的那样,当未提供catch处理程序(或者它不是函数)时,默认值将抛出错误.在一个promise链中,这个错误可以通过catch方法回调来捕获,但是如果没有,JavaScript引擎将像处理任何其他未捕获的错误一样处理错误,并在这种情况下应用默认处理程序,这会导致您在控制台中看到的输出.

为了避免这种情况,将.catch方法链接到第一个返回的promise then,如下所示:

p.then( result =>  console.log('Fulfilled'))
 .catch( error =>  console.log(error) );
Run Code Online (Sandbox Code Playgroud)

  • 谢谢小装饰。我做了一些额外的研究,发现如果未显式传递onRejected处理程序,则JS将提供一个隐式变量:`如果IsCallable(onRejected)`是** false **,则使`onRejected`为“ ** Thrower **” 。看起来像这样:`arg => throw arg`一个空的onRejected处理程序`()=> {}`可以覆盖此行为。但是'null'不会。_ref:http://www.ecma-international.org/ecma-262/6.0/index.html#sec-performpromisethen_ (2认同)
  • @trincot我将其链接起来,它仍然给我未捕获的错误消息 (2认同)