结论
先抛出结论,如下:
- 一个promise中,resolve、reject只会执行最先触发的那个,执行完就停止了
- 根据 resolve|reject 输出 then|catch、finally
- 多个resolve或多个reject只会执行第一个
- Promise立即执行函数里面的其他语句不会受到resolve、reject影响
- 第一次then|catch、finally执行的是promise内部的结果
- 第一次then|catch的参数来自promise内部的resolve、reject,finally始终无参数
- 第二次及以后的then一定会执行,参数来自上一个then的返回值,无返回值时参数为undefined
- 第二次及以后的finally一定会执行,无参数,为undefined
- 第二次及以后的then中如果return Error,会被下一个then作为参数输出,finally始终无参数。只会影响下一个,不会影响下下个。
- 第二次如果是throw Error,则会被当前紧挨着的catch语句所捕获
- 即:return Error只是作为一个常规的返回值(值为Error),而throw则是直接抛出异常
- 在then中连续写两个回调,第一个参数为then,第二个参数为catch,在then后面再写一个catch。
如果promise是resolve,在then的第一个参数中throw Error,会被下一个catch所捕获
如果promise是reject,在then的第二个参数中throw Error,会被下一个catch所捕获 - 即:then…catch可以将两个回调都写在then里面,直接写两个参数,then后面的catch会被当前其他语句的catch,只有前面的then内部抛出异常才会执行。
分析
case1_resovle
1 | function testPromise1(val) { |
case2_reject
1 | function testPromise2(val) { |
case1、case2结论:
- 一个promise中,resolve、reject只会执行最先触发的那个,执行完就停止了
- 根据 resolve|reject 先输出 promise 自己的then|catch、finall
case3_多resolve、reject
1 | function testPromise3(val) { |
case3结论:
- 多个resolve或多个reject只会执行第一个
- Promise立即执行函数里面的非resolve、reject语句不会受到resolve、reject影响
case4_多then、catch、finally无return
1 | function testPromise4(val) { |
case5_resolve引发多then、catch、finally有return
1 | function testPromise5(val) { |
case6_reject引发多then、catch、finally有return
1 | function testPromise6(val) { |
case4、case5、case6结论:
- 第一次then|catch、finally执行的是promise内部的结果
- 第一次then|catch的参数来自promise内部的resolve、reject,finally无参数
- 第二次及以后的then一定会执行,参数来自上一个then的返回值,无返回值为undefined
- 第二次及以后的finally一定会执行,无参数,为undefined
case7_new Error
1 | function testPromise7(val) { |
case8_throw Error
1 | function testPromise8(val) { |
case7、case8结论:
- 第二次及以后的then中如果return Error,会被下一个then作为参数输出,finally始终无参数。只会影响下一个,不会影响下下个。
- 第二次如果是throw Error,则会被当前的catch语句所捕获
- return Error只是作为一个常规的报错返回,而throw则是直接抛出异常
case9_then回调两个参数return Error
1 | function testPromise9(val) { |
case10_then回调两个参数throw Error
1 | function testPromise10(val) { |
case11_then回调三个参数
1 | function testPromise11 (val) { |
case9、case10结论:
- 在then中连续写两个回调,第一个参数为then,第二个参数为catch,在then后面再写一个catch。
- 如果是resolve,在then的第一个参数中throw Error,会被下一个catch所捕获
- 如果是reject,在then的第二个参数中throw Error,会被下一个catch所捕获
- 即:then…catch可以将两个回调都赋给then,直接写两个参数,then后面的catch会被当前其他的catch,只有前面的then内部抛出异常才会执行。