promise(4)修改promise状态和回调函数的顺序

改变promise的状态和指定回调函数的顺序谁先谁后???

答案:都有可能:正常情况下:先指定回调函数,在改变状态,当然顺序也可以反过来

注意:.then()是同步执行,但是.then()里面处理成功的回调处理失败的回调是异步执行的
Promise构造函数里面的构造器函数是同步执行,里面的resolvereject函数是同步执行(状态的改变是同步执行的。而then里面的onResolvedonRejected接收成功和失败的回调是异步执行的)
注意:.then()里面指定回调函数的调用所必备的两个条件:
1.指定对应状态的发生改变。
2. .then()里面必须制定好对应的回调函数
在这里插入图片描述

回调函数:自己定义的函数,不是自己调用而是由系统调用
执行器函数:执行器函数里面的resolvereject不是我们定义的、由我们自己调用,因此他们不是回调函数(同步执行)
.then里面的onResolvedonRejected函数使我们自己定义的,不是我们调用,由系统决定调用时机,因此他是回调函数

const p1 = new Promise((resolve,reject) => {
         //执行器函数
        console.log('执行器函数开始执行');
         setTimeout(() => {
             //执行异步操作,并在里面进行状态的修改
            if(3 == 3){
                resolve('异步任务执行成功!!');//此时状态发生改变
            }else{
                reject('异步任务执行失败!!')
            }
         },0)

    });
     //指定回调(因为状态的改变是在异步操作内完成,因此执行器函数执行完就会立即执行p1.then();而状态的改变是在其之后进行执行)
    p1.then(
        //成功的回调(异步执行)
        value => {console.log('状态发生改变后获取的value :' + value);},
        //失败的回调(异步执行)
        reason => {console.log('状态发生改变后获取的reason:' + reason);}
    )
    console.log('测试.then()里面的函数是否是异步执行的');

运行结果:在这里插入图片描述

练习:判断下面代码的输出结果

 const p1 = new Promise((resolve,reject) => {
         //执行器函数(同步执行)
        console.log('执行器函数开始执行');
         setTimeout(() => {
             //执行异步操作,并在里面进行状态的修改(异步执行)
             console.log('异步任务setTime开始执行---------------');
            if(3 == 3){
                console.log('1');
                resolve('异步任务执行成功!!');//此时状态发生改变
                console.log('2');
            }else{
                reject('异步任务执行失败!!')
            }
             console.log('异步任务setTime即将结束---------------');
         },0)

    });
     //指定回调(因为状态的改变是在异步操作内完成,因此执行器函数执行完就会立即执行p1.then();而状态的改变是在其之后进行执行)
    p1.then(
        //成功的回调(异步执行)
        value => {console.log('状态发生改变后获取的value :' + value);},
        //失败的回调(异步执行)
        reason => {console.log('状态发生改变后获取的reason:' + reason);}
    )
    console.log('测试.then()里面的函数是否是异步执行的');//(同步执行)
  
 

运行结果:
在这里插入图片描述

如何先改变状态,在指定回调???

答案:
* 方法一:在执行器中直接调用resolve()或reject()
* 方法二:延迟更长时间才调用then()

方法一:

const p2 = new Promise((resolve,reject) => {//执行器函数(同步执行)
        resolve('Success Data');//修改状态(同步执行)
    });
    p2.then(//.then()同步执行
        value => {console.log('value: ' + value);} //成功的回调函数(异步执行)
    );

方法二:

 const p3 = new Promise((resolve,reject) => {
        setTimeout(() => {
            resolve('Success Data!!');
        })
    },1000);
    setTimeout(() => {
        p3.then(
            value => {console.log('value: ' + value);}
        )
    },2000)

什么时候才得到数据???

答案:
* 情况一:先指定回调:当状态发生改变就会调用回调函数,此时便得到数据
* 情况二:先改变状态:状态已经被确定,当回调函数一指定时便被调用,此时得到数据

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值