温故知新(七一)Promise 构造函数是同步还是异步执行,then 呢

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 中成功的函数。

 

 

 

你可能感兴趣的:(温故知新)