面试官问到实现一个promise.all方法?
首先定义一个返回promise对象的函数
function promiseAll(promises) {
return new Promise((resolve, reject) => {
});
}
然后在函数中实现具体方法
// 判断传入的promise对象是否为空,空--> reject
if (promises === null || promises.length < 1) {
reject(new Error("[]"));
}
// 定义一个数组储存任务
let res = [];
let count = 0; // 定义计数统计任务个数
// 定义append执行函数
let append = (idx, val, flag) => {
res[idx] = val;
if (!flag) {
reject(val);
}
// 执行完毕,resolve
if (++count === promises.length) {
resolve(res);
}
};
// 循环promise对象取出每一个promise执行
for (let i = 0; i < promises.length; i++) {
let p = promises[i];
p.then(data => {
append(i, data, true);
}).catch(err => {
append(i, err, false);
return;
});
}
整体如下:
function promiseAll(promises) {
return new Promise((resolve, reject) => {
if (promises === null || promises.length < 1) {
reject(new Error("[]"));
}
let res = [];
let count = 0;
let append = (idx, val, flag) => {
res[idx] = val;
if (!flag) {
reject(val);
}
if (++count === promises.length) {
resolve(res);
}
};
for (let i = 0; i < promises.length; i++) {
let p = promises[i];
p.then(data => {
append(i, data, true);
}).catch(err => {
append(i, err, false);
return;
});
}
});
}
测试:
let p1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(1);
}, 3000);
});
let p2 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(2);
}, 2000);
});
let p3 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(3);
}, 1000);
});
promiseAll([p1, p2, p3])
.then(res => {
console.log("my promise all success>>>", res);
})
.catch(err => {
console.log("my promise all error>>>", err);
});
Promise.all([p1, p2, p3])
.then(res => {
console.log("promise all success>>>", res);
})
.catch(err => {
console.log("promise all error>>>", err);
});
执行结果1
执行结果2
let p1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(1);
}, 3000);
});
let p2 = new Promise((resolve, reject) => {
setTimeout(() => {
reject(2);
}, 2000);
});
let p3 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(3);
}, 1000);
});