【第12周 Promise 3-1 then( )方法】关于Promise中参数resolve和reject的问题

【第12周 Promise 3-1 then( )方法】关于Promise中参数resolve和reject的问题

问题描述:

Q1:图1中, 因为p里面调用的是reject,所以后面的所有函数都在p.then的第二个回调函数中进行。p.then的第一个回调函数不执行。是这样吗?

Q2:图2中,return undefined是默认执行的吗?即要传成功,什么都不写的话。系统会默认执行return undefined?

Q3:图2中,默认情况下调用resolve,可以省略reject参数;那Promise调用reject()的时候,可以省略resolve参数吗?即Promise(reject => reject(););

Q4:图3中,如果p.then()中没有返回值,p.then().then()中,执行第一个回调,不执行第二个回调函数,是否是按顺序执行的原因?

https://img1.sycdn.imooc.com//climg/61c2c2f809dc108610740452.jpg


麻烦老师指导下


相关截图:

图1:

https://img1.sycdn.imooc.com//climg/61c2be2a09db04df07540180.jpg

图2:

https://img1.sycdn.imooc.com//climg/61c2be0409ab14e911561256.jpg

图3:

https://img1.sycdn.imooc.com//climg/61c2be420987851310320778.jpg

相关代码:

//3. then方法返回的Promise对象的状态改变
const p = new Promise((resolve,reject)=>{
//resolve();
reject();
});

p.then(     //第一次then:上面是reject(),所以执行第二个回调函数,才能将后面的then执行
()=>{
console.log('success1');
},
()=>{
console.log('error1');
//1)传成功
return undefined;
//在then的回调函数中,return后面的东西,会用Promise包装一下
//return undefined  等价于:
return new Promise((resolve,reject)=>{
resolve(undefined);         //默认情况下Promise调用resolve方法
});

return 123;         //输出 success 123
//等价于:
return new Promise(resolve => {
resolve(123);
});

//2)传失败    return不简写,写完整的就行
return new Promise(resolve,reject => {
reject('reason');       //最后输出 err2 reason
});


}).then(    //第2次then:这里的then由p.then决定,不由p决定
(data)=>{
console.log('success2',data);  //下面的then按顺序执行这里的回调
return undefined;
//等价于:
return new Promise(resolve => {
resolve(undefined);
});
},
(err)=>{
console.log('error2',err);
}
).then(     //第3次then:由第2次then返回的值决定,和第一次then无关
(data)=>{
console.log('success3',data);       //success3,undefined
},
(err)=>{
console.log('error3',err);
}
);

//3. then方法返回的Promise对象的状态改变

const p = new Promise((resolve,reject)=>{

//resolve();

reject();

});


p.then(     //第一次then:上面是reject(),所以执行第二个回调函数,才能将后面的then执行

()=>{

console.log('success1');

},

()=>{

console.log('error1');

//1)传成功

return undefined;

//在then的回调函数中,return后面的东西,会用Promise包装一下

//return undefined  等价于:

return new Promise((resolve,reject)=>{

resolve(undefined);         //默认情况下Promise调用resolve方法

});


return 123;         //输出 success 123

//等价于:

return new Promise(resolve => {

resolve(123);

});


//2)传失败    return不简写,写完整的就行

return new Promise(resolve,reject => {

reject('reason');       //最后输出 err2 reason

});



}).then(    //第2次then:这里的then由p.then决定,不由p决定

(data)=>{

console.log('success2',data);  //下面的then按顺序执行这里的回调

return undefined;

//等价于:

return new Promise(resolve => {

resolve(undefined);

});

},

(err)=>{

console.log('error2',err);

}

).then(     //第3次then:由第2次then返回的值决定,和第一次then无关

(data)=>{

console.log('success3',data);       //success3,undefined

},

(err)=>{

console.log('error3',err);

}

);


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕然然 2021-12-22 14:49:36

同学你好,解答如下:

1、是的,如果调用reject方法,那么将会执行then方法的第二个回调函数,不会执行第一个回调函数。不过如果后面还有then方法的话,则需要根据上一个then方法中的返回状态来决定执行第一个回调函数,还是第二个回调函数,如图

https://img1.sycdn.imooc.com//climg/61c2ca070983a78308730340.jpg

2、是的,默认返回undefined。

3、不可以省略,如果省略第一个参数的话,那么就会将reject当作resolve来执行,参数的位置不能改变。

祝学习愉快!

  • 提问者 easyschen #1

    Q4:图3中,如果p.then()中没有返回值,p.then().then()中,执行第一个回调,不执行第二个回调函数,是否是按顺序执行的原因?

    2021-12-22 15:34:18
  • 好帮手慕然然 回复 提问者 easyschen #2

    不是的,then方法到底是执行第一个回调函数,还是执行第二个回调函数,是由上一个then方法的返回状态来决定的,不是按顺序执行的。

    比如:在p.then().then()中,如果第一个then方法返回成功状态,那么第二个then方法执行第一个回调函数;而如果第一个then方法返回失败状态,那么第二个then方法执行第二个回调函数。

    因此,如果p.then()中没有返回值,那么就会默认返回成功状态,此时下一个then方法,会根据上一个then方法返回的状态,即成功状态,来执行第一个回调函数(即成功回调)。

    https://img1.sycdn.imooc.com//climg/61c2e03a095b9eb913800788.jpg

    祝学习愉快!

    2021-12-22 16:24:05
  • 提问者 easyschen 回复 好帮手慕然然 #3

    如果p.then()中没有返回值,那么就会默认返回成功状态。


    感谢老师,明白了。我漏掉了。




    2021-12-23 19:16:07
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师