Promise到底是同步还是异步的?
第一次写博客,希望各位技术大神多多指导,如有不对之处,还请不吝指出。话不多说,直接上文。我们都知道,Promise是ES6提出的解决异步编程导致陷入回调地狱问题的,那么Promise是同步的还是异步的?可以确定的是,Promise本身是同步的,怎么证明呢?我们来看代码:
console.log(1)
let a = new Promise((res,rej) => {
console.log(2);
});
console.log(3);
let b = new Promise((res,rej) => {
console.log(4);
});
console.log(5);
这段代码输出什么呢?
1,3,5,2,4?还是1,2,3,4,5?
好了不卖关子了,输出的是1,2,3,4,5。从上到下依次输出,这段代码足以证明Promise本身是同步的,那是不是可以得出结论Promise是同步的呢?如果结论这么简单的话,就太不严谨了,而且我们在项目中也不会这么用Promise,我们在来看下面这段更贴近于真实项目的代码:
console.log(1)
let a = new Promise((res,rej) => {
console.log(2);
res();
});
console.log(3);
let b = new Promise((res,rej) => {
console.log(4);
res();
});
console.log(5);
a.then(() => {
console.log(6)
})
b.then(() => {
console.log(7)
})
这次的输出结果是什么呢?
1,2,3,4,5,6,7?还是1,2,6,3,4,7,5?还是什么别的答案。
答案是1,2,3,4,5,6,7,还是同步啊…别着急,咱们来将下面Promise成功后的方法稍微网上挪挪,变成下面这样:
console.log(1)
let a = new Promise((res,rej) => {
res();
console.log(2);
});
a.then(() => {
console.log(6)
})
console.log(3);
let b = new Promise((res,rej) => {
res();
console.log(4);
});
b.then(() => {
console.log(7)
})
console.log(5);
我们将Promise执行成功后调用的方法往上移了一下,并且在Promise内部调用成功的方法放在了输出的前面,这样可以保证进入Promise首先执行的就是成功的方法,这次会输出出什么?
输出的顺序还是不变的,依然是1,2,3,4,5,6,7。从这两段代码三段代码我们可以得出结论: **
Promise本身是同步的,他的then方法和catch方法是异步的
**。
版权声明:本文为weixin_43989306原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。