当未处理的拒绝诺言抛出错误时

时间:2019-12-16 11:13:25

标签: javascript promise

我的想法是,在待处理承诺将其状态更改为被拒绝的承诺时,应在其中排队拒绝处理程序 ,否则诺言会引发错误。但是我不是那样的

Promise.reject("error"); //or new Promise((resolve, reject) => reject("error"))
//.
//.
//.
console.log("end of script");

输出将为

//end of script
//Uncaught (in promise) error

所以我的问题是,未处理的诺言何时会抛出错误? 谢谢

编辑

我的问题是由于没有拒绝处理程序而导致抛出错误的时间,即使该处理过程为Sync

console.log(new Promise((resolve, reject) => reject("error")))
//prints 'Promise {<rejected>: "error"}' not pending because it ran synchronously

如此

new Promise((resolve, reject) => reject("error"))   //(1)

console.log("end of script");

为什么行(1)在打印'脚本结尾'

之前不引发错误

3 个答案:

答案 0 :(得分:1)

Promise.reject总是会由于某些拒绝的原因而返回promise。您必须使用.catch

来显式地处理它。

例如:

Promise.reject('test').catch(()=>{console.log('error is handled.')})
//new Promise((resolve, reject) => reject("error")).catch(()=>{console.log('this is the test')})

Promise.reject只是拒绝某些情况的东西。如果您希望在此错误引发之后发生某些事情,那么您必须在陷阱中做。

答案 1 :(得分:1)

未处理的拒绝承诺实际上不会引发未处理的异常。如果没有任何东西可以处理拒绝,则默认行为倾向于记录为发生未处理的拒绝。它不会当前,但是默认情况下会使您的脚本/程序崩溃(尽管该承诺链将消失,并停止调用下一个AMQ229119: Disk Capacity is Low, cannot produce more messages. 处理程序)。

在NodeJS中运行时,流程对象会在发生这种情况时发出事件,该事件记录在这里:https://nodejs.org/api/process.html#process_event_unhandledrejection

then

例如,您可以通过使用错误代码退出程序来对此做出响应。

在Web浏览器中运行时,窗口对象会发出类似的事件,记录在这里:https://developer.mozilla.org/en-US/docs/Web/API/Window/unhandledrejection_event

process.on('unhandledRejection', (reason, promise) => {
  console.log('Unhandled Rejection at:', promise, 'reason:', reason);
  // Application specific logging, throwing an error, or other logic here
});

编辑:如评论中所指出,此默认行为计划在更高版本的NodeJS中更改,并且自MR {{ 3}}进入了v10

test.js

window.addEventListener("unhandledrejection", event => {
  console.warn(`UNHANDLED PROMISE REJECTION: ${event.reason}`);
});

当前默认值:

Promise.reject("test")

setInterval(()=>{
  console.log("alive");
}, 500)
  • 发出弃用警告,提示未处理的拒绝,但仍然有效

未来默认值:

$ node test.js
  • 将未处理的拒绝转换为未处理的异常并退出流程。

答案 2 :(得分:1)

  

所以我的问题是,未处理的诺言何时会抛出错误?谢谢

嘿,我做了一些工作。基本上:它是实现的定义。在Node上,我们这样做(Chrome也这样做):

  • 如果没有捕获处理程序,则拒绝诺言
  • 请稍等(所有.thennextTickenqueueMicrotask完成)。
  • 如果那时没有人处理过,并且之前任何I / O将其标记为未处理,则触发未处理的拒绝事件。

因此,在您的情况下,发生在日志之后,但在任何I / O或setTimeouts之前。

请注意,如果您稍后在诺言中添加.catch,则会将分机从红色转换为黑色,因为它将被“处理”。


注意:您应该始终处理promise错误,并努力在代码中不要出现任何未处理的拒绝:]