2017-02-25 53 views
10

一旦承诺reject()回调被调用,警告消息“未捕获(承诺)”出现在Chrome控制台中。我无法围绕它背后的原因,也不知道如何摆脱它。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)) 

警告:

enter image description here

编辑:

我发现,如果onRejected处理程序未明确提供给.then(onResolved, onRejected)方法,JS会自动提供一个隐含的一个。它看起来像这样:(err) => throw err。自动生成的处理程序将轮到它。

参考:

如果IsCallable(onRejected)`是,然后
     让onRejected是 “运动员”。

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

回答

8

这是因为你没有一个catch处理程序附加到第一then方法,它因此,是没有处理程序时的承诺,拒绝返回的承诺。你有一个为承诺p在最后一行,但不是为链接承诺,由then方法返回,在行之前。

正如您在下面的注释中正确添加的,当没有提供捕捉处理程序(或它不是函数)时,该错误为default one will throw。在承诺链中,这个错误可以通过catch方法回调找到,但如果没有,JavaScript引擎将处理类似于任何其他未捕获错误的错误,并在这种情况下应用默认处理程序,结果在你看到的输出中。

为了避免这种情况,链.catch方法由第一then返回,这样的承诺:

p.then(result => console.log('Fulfilled')) 
.catch(error => console.log(error)); 
+0

谢谢trincot。我做了一些额外的研究,发现如果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_ –

+0

不客气,对EcmaScript规范有很好的参考!为了完整起见,我将其添加到了我的答案中。大! – trincot

+0

@trincot我把它链接了起来,它仍然给我未被捕获的错误信息 –