标签:结束 设置 web res seconds 回调 event http hello
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/EventLoop
https://zhuanlan.zhihu.com/p/33058983
const?s?=?new?Date().getSeconds();
console.log(s);
setTimeout(function?()?{
??//?输出?"2",表示回调函数并没有在?500?毫秒之后立即执行
??console.log("s?is?:?"?+?s);
??console.log("Ran?after?"?+?(new?Date().getSeconds()?-?s)?+?"?seconds");
},?500);
console.log("after?setTimeout...");
while?(true)?{
??//???console.log("loop...");
??if?(new?Date().getSeconds()?-?s?>=?2)?{
????console.log("Good,?looped?for?2?seconds");
????break;
??}
}
//?23
//?after?setTimeout...
//?Good,?looped?for?2?seconds
//?s?is?:?23
//?Ran?after?2?seconds
在上面的例子中,while 循环一直在占用消息队列,直到 2 秒之后循环结束,此时 setTimeout 的 500ms 早已到期,所以立即执行,输出 2。
const?promise?=?new?Promise(function?(resolve,?reject)?{
???setTimeout(function?()?{
????console.log("hello");
??},?0);
resolve("ok");
??console.log("end");
});
promise.then(function?(value)?{
??console.log(value);
});
//?end
//?ok
//?hello
在这个例子中,即使 setTimeout 的 delay 设置为 0,resolve 还是先于 setTimeout 执行。
axios 的 request 和 response 的拦截器经常这么写,其实就是对一个错误进行抛出,和 throw 效果一样,需要在接下来的 catch 中进行捕获。
let?foo?=?new?Promise((resolve,?reject)?=>?{
??reject(‘hwhw‘);
});
foo
??.then(
????(res)?=>?{
??????console.log(‘then...‘);
??????console.log(res,?x);
????},
????(error)?=>?{
??????console.log(‘then--error...‘);
??????console.log(error);
??????//?return?Promise.reject(error?+?‘again‘);?//?和下面的?new?Error?作用一样,都是被?catch?捕获
??????throw?new?Error(error?+?‘again2‘);
????}
??)
??.catch((error)?=>?{
????console.log(‘catch...‘);
????console.log(error.message);
??});
标签:结束 设置 web res seconds 回调 event http hello
原文地址:https://www.cnblogs.com/ainsliaea/p/13229341.html