JavaScript的异步编程之Promise( 三 )

如果传入的是一个对象 , 并且这个对象也有一个跟Promise一样的then方法 , 也就是说这个方也也可以接收到onFulfilled, onRejected 两个回调 , 并且可以调用回调传递参数 , 这种有then方法的对象实现了一个thenable的接口 , 支持这种对象的原因是因为原生Promise还没有被普及之前 , 很多时候都是第三方的库实现的Promise
Promise.resolve({then (onFulfilled, onRejected) {onFulfilled('123')}}).then(ret => {console.log(ret) // 123})Promise.reject快速创建一个一定是失败的Promise对象 , 这个方法的参数就是Promise失败的原因
Promise.reject("嘿嘿 , 这就是错误的理由").catch(err => {console.log(err) // 嘿嘿 , 这就是错误的理由})Promise.all接收一个数组 , 这些元素都是一个Promise对象 , 这个方法会返回一个全新的Promise对象 , 当内部所有Promise的都完成之后Promise.all返回的Promise对象才会完成 。这个时候Promise.all返回的Promise对象拿到的结果是一个数组 , 这个数组中包含了每一个Promise返回的结果 。值得注意的是只有数组中的所有Promise都成功了结束了 , Promise.all返回的Promise对象才会成功结束 。如果数组中有一个Promise失败的结束了 , 那么Promise.all返回的Promise对象也会以失败的结束
Promise.all([ajax('/url1'),ajax('/url2'),ajax('/url3'),ajax('/url4'),]).then(values => {console.log(values)}).catch(err => {console.log(err)})Promise.race与 Promise.all方法一样也是接收一个数组 , 这些元素都是一个Promise对象 , 这个方法会返回一个全新的Promise对象 , 但是与Promise.all方法不同的是Promise.all是等待所有任务的结束而结束,Promise.race只会等待第一个结束的任务而结束
const request = ajax('/api/???')const timeout = new Promise((resolve, reject) => {setTimeout(() =>reject('timeout'), 5000);})Promise.race([request,timeout]).then(ret => {console.log(ret)}).catch(err => {console.log(err)})上面代码中 , 如果接口在5秒之前接口返回了 , 那么我们可以正常的得到返回结果 , 如果5秒还没有返回 , 那么请求就没有办法把结果返回回来了 , 因为timeout这个Promise会在5秒后以失败的方式结束 , 而Promise.race就是以第一个结束的Promise而结束
Promise.allSettled与 Promise.all、Promise.race方法一样也是接收一个数组 , 这些元素都是一个Promise对象 , 这个方法会返回一个全新的Promise对象 , 与他们不同的是无论这些Promise执行是成功还是失败都是等这些Promise都完成了之后才会完成 , 当有多个彼此不依赖的异步任务成功完成时 , 或者总是想知道每个promise的结果时 , 通常使用它
const promise1 = Promise.resolve(3);const promise2 = new Promise((resolve, reject) => setTimeout(reject, 100, 'foo'));const promises = [promise1, promise2];Promise.allSettled(promises).then((results) => results.forEach((result) => console.log(result.status)));// > "fulfilled"// > "rejected"Promise.any与

经验总结扩展阅读