上面代码中,如果接口在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
执行是成功的就算成功,只有全部都失败了才会失败 。这个全新的Promise
的 onFulfilled
的回调函数的参数为第一个成功完成的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、MutationObserver
和nodejs
中的process.nextTick
会作为微任务在本轮调用的末尾执行
更多内容微信公众号搜索【JavaScript的异步编程之Promise】充饥的泡饭
小程序搜一搜开水泡饭的博客
推荐阅读
- 原神3.0乱纹精致宝箱怎么开启
- 原神伞盖菌褶的漏洞怎么玩
- 原神溢神的论证无止境的开题报告怎么通关
- 华为Nova9Pro防水吗_华为Nova9Pro防不防水
- 为什么我的世界没法做枪(我的世界里怎样能有枪)
- 我的世界手机版用命令怎么做枪(我的世界科技枪模组手机版)
- 我的世界始源之枪怎么做(我的世界怎么合成圣龙枪)
- 手机版我的世界创造模式怎么做枪(我的世界创造模式怎么进入末地)
- 我的世界暗物质武器怎么做(我的世界暗物质套怎么合成)
- 我的世界怎么造个最好的枪(我的世界怎么获得最好的精英枪)