当面试官问你如何合并100ms内的相同请求,并给每个请求都返回一个promise的时候,他到底在考什么??
Promsie一共有6个原生的方法,如何利用好这些方法解决实际问题呢?需要对每个方法的使用场景有概念。
Promise.all:
| 方法 | 入参 | 出参 | 结束条件 |
|---|---|---|---|
| Promise.all | promise数组 | 一个promise结果数组 | 任意一个被reject或者所有的被resolve |
| Promise.allSettled | promise数组 | 一个promise结果数组 | 所有的promise都有结果之后 |
| Promise.any | promise数组 | 一个promise或者一个[AggregateError]对象 | 任意一个resolve或者所有的被reject |
| Promise.race | promise数组 | 第一个被resolve的promise结果 | 有一个promise被resolve |
| Promise.reject | any | promise对象 | - |
| Promise.resolve | any | promise数组 | - |
Promise.any
const promise1 = Promise.reject(0);
const promise2 = new Promise((resolve,reject) => setTimeout(()=>{reject(1)},100));
const promise3 = new Promise((resolve,reject) => setTimeout(()=>{reject(2)},300));
const promises = [promise1, promise2, promise3];
Promise.any(promises).then((value) => console.log(value)).catch((e)=>console.log(e.errors));
const promise1 = Promise.reject(0);
const promise2 = new Promise((resolve,reject) => setTimeout(()=>{resolve(1)},100));
const promise3 = new Promise((resolve,reject) => setTimeout(()=>{reject(2)},300));
const promises = [promise1, promise2, promise3];
Promise.any(promises).then((value) => console.log(value)).catch((e)=>console.log(e.errors));
比较常用的场景:
情景1: 一个页面上需要展示多个头像,每个头像都要通过一个requestAvatar的请求获取,如何合并在100ms内的相同请求,并给每个调用的地方都返回一个promise?
已知条件:
- 一个批量请求接口
- 每100ms只能批量请求一次
请给出一个函数,每次入参为一个uid,返回一个promise,如果请求结果里有uid则表示查到,否则返回一个拒绝的promise