Joh*_*ohn 10 javascript asynchronous promise
我在理解javaScript时遇到了麻烦promises
。我写了以下代码:
var p = new Promise(function(resolve,reject){
reject(Error("hello world"));
});
setTimeout(()=>p.catch(e=>console.log(e)),5000);
Run Code Online (Sandbox Code Playgroud)
我以前从未在javaScript代码和开发人员控制台之间看到过这种行为,在这里,我的javaScript代码可以在开发人员控制台中“修改现有内容”。
因此,我决定resolve
通过编写以下代码来查看是否发生相同的情况:
var p = new Promise(function(resolve,reject){
resolve("hello world");
});
setTimeout(()=>p.then(e=>console.log(e)),5000);
Run Code Online (Sandbox Code Playgroud)
但是在这种情况下,我的开发者控制台要等5秒钟后才显示任何内容,然后打印到hello world
。
为什么在调用时将resolve
和reject
区别开来?
额外
我也写了这段代码:
var p = new Promise(function(resolve,reject){
reject(Error("hello world"));
});
setTimeout(()=>p.catch(e=>console.log("errors",e)),5000);
setTimeout(()=>p.catch(e=>console.log("errors 2",e)),6000);
setTimeout(()=>p.catch(null),7000);
Run Code Online (Sandbox Code Playgroud)
这将导致多个输出到开发人员控制台。红色错误在时间0处出现,红色在5秒处变为带有文本的黑色errors hello world
,然后在6秒钟处出现新的错误消息errors 2 hello world
,然后在7秒钟处出现红色错误消息。现在我对一个reject
实际被调用多少次感到非常困惑。...我迷路了...
T.J*_*der 11
哇,真酷。我以前从未见过控制台这样做。(不过,它还有其他形式的动态行为,所以...)这是发生了什么:
在第一种情况下,您的setTimeout
回调代码之外的所有内容的代码执行完成,并且执行堆栈返回,因此仅“ 平台代码 ”(如Promises / A +规范所称)正在运行,而不是用户级JavaScript代码(此刻)。那时,promise被拒绝了,没有任何东西可以处理拒绝,因此这是一个未处理的拒绝,devtools会向您报告。
然后,五秒钟后,您的回调将运行并附加一个拒绝处理程序。在这一点上,拒绝不再被处理。显然,Chrome / V8 / devtools可以一起从控制台中删除未处理的拒绝警告。您所看到的是您通过拒绝处理程序中输出的内容console.log
。如果您更快地附加了拒绝处理程序,则不会收到该未处理的拒绝错误。
履行不会发生这种情况,因为不处理履行不是错误条件。不处理拒绝是。