我的想法是,在待处理承诺将其状态更改为被拒绝的承诺时,应在其中排队拒绝处理程序 ,否则诺言会引发错误。但是我不是那样的
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)在打印'脚本结尾'
之前不引发错误答案 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也这样做):
.then
和nextTick
和enqueueMicrotask
完成)。 因此,在您的情况下,发生在日志之后,但在任何I / O或setTimeouts之前。
请注意,如果您稍后在诺言中添加.catch
,则会将分机从红色转换为黑色,因为它将被“处理”。
注意:您应该始终处理promise错误,并努力在代码中不要出现任何未处理的拒绝:]