在异步编程中,Promise 扮演了举足轻重的角色,它解决了 ajax 请求过程中的回调地狱的问题,令代码更具可读性。
实现Promise.all
Promise.all 方法接受一个 promise 的 iterable 类型的输入,并且只返回一个 Pormise 实例,那个输入的所有 promise 的 resolve 回调的结果是一个数组。这个 Promise 的 resolve 回调执行是在所有输入的 promise 回调都结束,或者输入的 iterable 里没有 promise 了的时候。它的 reject 回调执行是,只要任何一个输入的 promise 的 reject 回调执行或者输入不合法的 promise 就会立即抛出错误,并且 reject 的是第一个抛出的错误信息。
const PromiseAll = (values) => {
let resolutions = [];
if (!Array.isArray(values)) {
reject(new TypeError("invalid_argument"));
}
return new Promise((resolve, reject) => {
try {
let count = values.length;
if (count === 0) {
resolve(resolutions);
} else {
for (let i = 0; i < values.length; i++) {
Promise.resolve(values[i]).then(
// 注:如果用var实现需要对下面的function使用闭包记录循环内的i值
// (function(){var i_captured=i; return function(x){ resolutions[i_captured] = x; if(--count===0){resolve(resolutions)}}})()
(x) => {
resolutions[i] = x;
if (--count === 0) {
resolve(resolutions);
}
},
(r) => {
reject(reject);
}
);
}
}
} catch (e) {
reject(e);
}
});
};