Promise 构造函数是同步还是异步执行,then 呢
Promise 构造函数时同步执行的,then 方法是异步执行的
示例:
new Promise(res=>{
console.log(1);
resolve(3);
}).then(res=>{
console.log(res);
});
console.log(2);
//执行结果 1 2 3
语法:
new Promise(function(resolve,reject){...});//executor
构建 Promise 对象时,需要传入一个 executor 函数,主要业务流程都在 executor 中执行。
Promise 构造函数执行时立即调用 executor 函数,resolve 和 reject 两个函数作为参数传递给 executor,resolve 和 reject 函数被调用时,分别将 Promise 的状态改为 fulfilled(完成) 和 rejected(失败)。一旦状态改变,就不会再变,任何时候都可以得到这个结果。
在 executor 函数中调用 resolve 函数后,会触发 Promise.then 设置回调函数;而调用 reject 函数后,会触发 Promise.catch 设置的回调函数。
值得注意的是,Promise 是用来管理异步编程的,它本身不是异步的,new Promise 的时候会立即把 executor 函数执行,只不过我们一般会在 executor 函数中处理一个异步操作,比如下面代码会先打印出 2。
let p1 = new Promise(()=>{
setTimeout(()=>{
console.log(1);
});
console.log(2);
});
console.log(3);
//2 3 1
Promise 采用了回调函数延迟绑定技术,在执行 resolve 函数的时候,回调函数还没有绑定,那么只能推迟回调函数的执行。
例子:
let p = new Promise((resolve,reject)=>{
console.log(1);
resolve('a');
console.log(2);
});
//then 设置成功或者失败后的处理方法
p.then(res=>{
// p 延迟绑定回调函数
console.log('成功'+res);
},reason=>{
console.log('失败'+reason);
});
console.log(3);
// 1 2 3 成功a
new Promise 的时候先执行 executor 函数,打印出1、2,Promise 在执行 resolve 时,触发微任务,还是继续往下执行同步任务,执行 p.then 时,存储起来的两个函数(此时这两个函数还没有执行),然后打印出 3 ,此时同步任务执行完成,最后执行刚才那个微任务,从而执行 .then 中成功的函数。