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的主要内容,如果未能解决你的问题,请参考以下文章

前端面试题之手写promise

什么时候然后从Promise.all()的子句运行?

Typescript编译器无法从Promise resolve调用中推断类型

前端片段整理

在 Promise 中包装 Auth0 的 parseHash 函数

在javascript承诺中执行的顺序是什么