改变promise的状态和指定回调函数的顺序谁先谁后???
答案:都有可能:正常情况下:先指定回调函数,在改变状态,当然顺序也可以反过来
注意:.then()
是同步执行,但是.then()里面处理成功的回调和处理失败的回调是异步执行的
Promise
构造函数里面的构造器函数是同步执行,里面的resolve
和reject
函数是同步执行(状态的改变是同步执行的。而then
里面的onResolved
和onRejected
接收成功和失败的回调是异步执行的)
注意:.then()
里面指定回调函数的调用所必备的两个条件:
1.指定对应状态的发生改变。
2. .then()
里面必须制定好对应的回调函数
回调函数:自己定义的函数,不是自己调用而是由系统调用
执行器函数:执行器函数里面的resolve
和reject
不是我们定义的、由我们自己调用,因此他们不是回调函数(同步执行)
.then
里面的onResolved
和onRejected
函数使我们自己定义的,不是我们调用,由系统决定调用时机,因此他是回调函数
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)
什么时候才得到数据???
答案:
* 情况一:先指定回调:当状态发生改变就会调用回调函数,此时便得到数据
* 情况二:先改变状态:状态已经被确定,当回调函数一指定时便被调用,此时得到数据