4. 你了解Promise吗?平时用的多吗?
4.1 Promise
中的回调函数在Promise
实例创建时就执行;
4.2 Promise.all(iterable)
你知道有什么特性吗?
- 接收一个iterable对象(里面并不都是Promise对象),并返回一个新的Promise对象;
- 该返回的promise对象在iterable参数对象里所有的promise对象都成功的时候才会触发成功,一旦有任何一个iterable里面的promise对象失败则立即触发该promise对象的失败;
- 这个新的promise对象在触发成功状态以后,会把一个包含iterable里所有promise返回值的数组作为成功回调的返回值,顺序跟iterable的顺序保持一致;
- 如果这个新的promise对象触发了失败状态,它会把iterable里第一个触发失败的promise对象的错误信息作为它的失败错误信息;
4.3 Promise.any(iterable)
:接收一个Promise对象的集合,当其中的一个 promise 成功,就返回那个成功的promise的值。
4.4 Promise.resolve(value)
:
- 返回一个状态由给定value决定的Promise对象。
- 如果该值是thenable(即,带有then方法的对象),返回的Promise对象的最终状态由then方法执行决定;
- 否则的话(该value为空,基本类型或者不带then方法的对象),返回的Promise对象状态为fulfilled,并且将该value传递给对应的then方法;
- 如果不知道一个值是否是Promise对象,使用Promise.resolve(value) 来返回一个Promise对象,这样就能将该value以Promise对象形式使用。
4.5 手写一个Promise.all()
:
function PromiseAll(promiseArray) {
return new Promise((resolve, reject) => {
if (!Array.isArray(promiseArray)) {
reject(new Error('传入的必须是数组!'));
}
const result = [];
const promiseNums = promiseArray.length;
let counter = 0;
for (let i = 0; i < promiseNums; i++) {
Promise.resolve(promiseArray[i]).then(value => {
result[i] = value;
counter++;
if (counter === promiseNums) {
resolve(result);
}
}).catch(e => reject(e));
}
});
}
4.6 Promise缓存:将Promise请求的结果缓存起来,下次直接在缓存中读取。