JavaScript的异步编程之Promise( 三 )

上面代码中,如果接口在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与 Promise.race方法一样也是接收一个数组 , 这些元素都是一个Promise对象,这个方法会返回一个全新的Promise对象,不同的是只要有一个Promise执行是成功的就算成功,只有全部都失败了才会失败 。这个全新的PromiseonFulfilled的回调函数的参数为第一个成功完成的Promise所传递的数据
const alwaysError = new Promise((resolve, reject) => {reject("失败就失败下一个成功");});const two = new Promise((resolve, reject) => {setTimeout(resolve, 30, "我是第二个完成的Promise");});const three = new Promise((resolve, reject) => {setTimeout(resolve, 70, "我是第三个个完成的Promise");});const one = new Promise((resolve, reject) => {setTimeout(resolve, 10, "我是最先完成的Promise");});Promise.any([two, three, alwaysError, one]).then((value) => {console.log(value); // 我是最先完成的Promise// 这个value是最先完成的Promise传递的值也就是=>我是最先完成的Promise})Promise 执行时序问题宏任务,微任务
测试执行顺序
console.log('global start')Promise.resolve().then(ret => {console.log('promise')})console.log('global end')// outlog// 1. global start// 2. global end// 3. promise链式调用多个执行看执行顺序
console.log('global start')Promise.resolve().then(ret => {console.log('promise1')}).then(ret => {console.log('promise2')}).then(ret => {console.log('promise3')})console.log('global end')// outlog// 1. global start// 2. global end// 3. promise1// 4. promise2// 5. promise3加入setTimeout
console.log('global start')setTimeout(() => {console.log('settimeout')}, 0);Promise.resolve().then(ret => {console.log('promise1')}).then(ret => {console.log('promise2')}).then(ret => {console.log('promise3')})console.log('global end')// 1. global start// 2. global end// 3. promise1// 4. promise2// 5. promise3// 6. settimeout没想到吧,Promise的异步时序执行优点特殊 。举个例子、假如我们去银行ATM办理存款 , 办完之后突然想起要转一笔账,这时候肯定会直接办理转账业务,不会到后面重新排队再转账 。这个例子中我们排队就像在javascipt中的等待执行的任务一样,我们队伍中的每一个人都对应着回调回列中的一个任务、 。回调队列中任务称之为宏任务,而宏任务执行过程中可以临时加上一些额外需求,这些额外的需求可以选择作为一个新的宏任务进行到队列中排队 。上面的setTimeout就会作为宏任务再次到回调队列中排队,也可以跟我们刚的例子一样作为当前任务的微任务直接在当前任务结束之后立即执行 。Promise的回调会作为微任务执行,会在本轮调用的末尾去执行,所以说上面代码会先打印promise1,promise2,promise3在打印settimeout
微任务是在后来才被引入到js中的,他的目的是为了提高整体的响应能力,目前的绝大多数异步调用都是作为宏任务执行 。Promise、MutationObservernodejs 中的process.nextTick会作为微任务在本轮调用的末尾执行

更多内容微信公众号搜索充饥的泡饭小程序搜一搜开水泡饭的博客
【JavaScript的异步编程之Promise】

推荐阅读