Promise
Posted ainsliaea
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Promise相关的知识,希望对你有一定的参考价值。
1. 事件循环和 Promise
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 执行。
2. return Promise.reject(error);
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);
??});
以上是关于Promise的主要内容,如果未能解决你的问题,请参考以下文章
Typescript编译器无法从Promise resolve调用中推断类型