注意
- 判断参数是否为空时,不能只根据length判断,因为只要是可迭代对象都可以用length。
js有哪些内置可迭代对象可以看另一篇文章:JS内置可迭代对象。
如何变为可迭代对象可以看其他两篇文章:Object.definePropery 和 使如下代码成立:var [a, b] = { a: 1, b: 2} - 防止用户传入非Promise,遍历的每一次都要通过
Promise.resolve()
强制将元素变为Promise。
Promise.myAll = function (proms) {
let res, rej // 存储状态
const p = new Promise((resolve, reject) => {
res = resolve
rej = reject
})
const result = []
// 参数为空的不可迭代对象,不能直接判断.length,因为只要是可迭代对象都可以用.length
let length = 0 // 记录参数长度
let fullFilledCount = 0 // 记录Promise完成的次数
for (const prom of proms) {
let index = length // 记录参数的下标,确保返回值的顺序
length++
// 确保每一项都是Promise,以防用户传错
Promise.resolve(prom).then(
data => {
// 1. 成功后,按照顺序添加到数组中
result[index] = data
console.log(result, "******");
fullFilledCount++ // 完成数+1
// 2. 如果是最后一个Promise,返回结果
if (fullFilledCount === length) {
res(result)
}
},
rej // 任意失败时,直接reject
)
}
if (length === 0) { res(result) }
return p
}
标签:resolve,迭代,JS,length,Promise,result,let,手写
From: https://blog.csdn.net/owo_ovo/article/details/137120501