如图中所输出内容,我们须要明白以下几点:
- catch会为promise注册拒绝回调函数,一旦异步操作停止,调用了reject回调函数,则依次履行注册的拒绝回调;
- 别的有一点和then办法类似,catch办法返回的新promise将应用其回调函数履行的返回值进行决定,如promise2,promise3状况均为完成(resolved),然则promise3最终值为undefined,而promise2最终值为successed,这是因为在调用promise.catch办法时,传入的回调没有显式的设置返回值;
- 对于promise4,因为调用catch办法时,回调中throw抛出异常,所以promise4状况为拒绝(rejected),拒绝原因为抛出的异常;
- 特别须要留意的是这里一共有四个promise,一旦决定,它们之间都是自力的,我们须要明白无论是then办法,照样catch办法,都邑返回一个新promise,此新promise与初始promise互相自力。
catch办法和then办法的第二个参数一样,都是为promise注册拒绝回调。
链式调用
和jQuery的链式调用一样,Promise设计也支撑链式调用,上一步的返回值作为下一步办法调用的主体:
- new Promise((resolve, reject) => {
- setTimeout(()=>{
- resolve('success');
- },0);
- }).then((msg) => {
- return 'second success';
- }).then((msg) => {
- console.log(msg);
- });
缺点处理
我们前文提到了JavaScript异步回调中的异常是难以处理的,而Promise对异步异常和缺点的处理是比较便利的:
- var promise = new Promise((resolve, reject) => {
- test(); // 抛出异常
- resolve('success'); // 被忽视
- });
- console.log(promise);
- promise.catch((reason) => {
- console.log(reason);
- });
输出如图,履行test抛出异常,导致promise被拒绝,拒绝原因即抛出的异常,然后履行catch办法注册的拒绝回调:
决定,完成与拒绝
- var promise = new Promise((resolve, reject) => {
- resolve(Promise.reject('failed'));
- });
- promise.then((msg) => {
- console.log('完成:' + msg);
- }, (reason) => {
- console.log('拒绝:' + reason);
- });
输出如图:
上例中,在创建一个Promise时,给resolve函数传递的是一个拒绝Promise,此时我们发明promise状况是rejected,所以这里第一个参数函数履行,完成的是一个更接近决定的过程(可以参考前文静述的决定过程),所以定名为resolve是更合理的;而第二个参数函数,则只是拒绝该promise: