Promise其它方法一

Promise其它方法在一些场景里面使用还是蛮有用的,今天完善一下其它一些方法。 catch: 这个是最简单的,catch其实就是没有成功方法resolve的then函数,所以catch方法: catch(errCallback){ return this.then(null, errCallback); } Promise.resolve()和Promise.reject(): 这两个用法很简单,就是立马执行成功或者失败,所以直接返回一个Promise然后直接执行成功失败方法,这是一个静态方法: static resolve(value){ return new Promise((resolve, reject) => { resolve(value); }) } static reject(value){ return new Promise((resolve, reject) => { reject(value); }) } 然后这边引申出一个问题,如果我是这样调用: Promise.resolve(new Promise((resolve, reject) => { setTimeout(() => { resolve(123); }, 3000) })).then(res => { console.log(res); }) Promise.reject(new Promise((resolve, reject) => { setTimeout(() => { resolve(321); }, 3000) })).catch(err => { console.log(err); }) Promise的resolve方法如果返回一个Promise,那么会等待这个Promise执行完,reject不会,所以我们在原来的resolve方法要加个判断,如果是Promise,就等待,所以添加一个判断方法: function isPromise(x){ if((typeof x === 'object' && x !== null) || typeof x === 'function'){ if(typeof x.then === 'function'){ return true; } }; return false; } if(isPromise(value)){ value.then((res) => { resolve(res); }, (err) => { reject(err); }) return; } 这个判断想写可以写跟resolvePromise一样,看是否是其它Promise。这个方法简写: if(isPromise(value)){ return value.then(resolve, reject); } 可以这样看代码: let resolve = (value) => { if(isPromise(value)){ value.then(res => resolve(res), err => reject(err)) return; } //... }; `` 应该就好理解多了,为什么可以那样简写。 all方法: all方法也是一个静态方法,会返回所有成功之后结果,结果是按顺序的,只要有一个失败就是失败: static all(promises) { return new Promise((resolve, reject) => { let resArr = []; let index = 0; let resCreat = (res, index) => { resArr[index] = res; index++; if(index === promises.length){ resolve(resArr); } }; for(let i = 0; i < promises.length; i++){ let current = promises[i]; if(isPromise(current)){ current.then(y => { resCreat(y, i); }, r => { reject(r); }) }else{ resCreat(current, i); } } }) } 循环传入的数组,如果是promise实例,就调用then方法,处理结果,如果不是就直接当作普通值处理结果,这边不能用push,因为不同的参数都是异步的,我们要保证顺序,就只能用index处理,如果都成功,我们要判断传入的数组长度跟当前的长度一样,就返回成功结果。 image

本文章由javascript技术分享原创和收集

发表评论 (审核通过后显示评论):