const isIterable = function (x) {
if (x !== undefined && x !== null && typeof x[Symbol.iterator] === 'function') {
return true
} else {
throw new TypeError(`${typeof x} ${x} is not iterable (cannot read property Symbol(Symbol.iterator))`)
}
}
当参数不是 iterable(可迭代的)时,会报错。如下:
rejected: TypeError: undefined is not iterable (cannot read property Symbol(Symbol.iterator))
rejected: TypeError: object null is not iterable (cannot read property Symbol(Symbol.iterator))
rejected: TypeError: boolean true is not iterable (cannot read property Symbol(Symbol.iterator))
rejected: TypeError: boolean false is not iterable (cannot read property Symbol(Symbol.iterator))
rejected: TypeError: number 5 is not iterable (cannot read property Symbol(Symbol.iterator))
rejected: TypeError: object is not iterable (cannot read property Symbol(Symbol.iterator))
(2)当参数是 empty 时
当参数是 empty iterable 时,不同方法的处理结果不同。如下:
静态方法
iterable
empty iterable 时返回的 promise
race()
必须
永远 pending
all()
必须
fulfilled []
allSettled()
必须
fulfilled []
any()
必须
rejected
AggregateError: All promises were rejected
MyPromise.race = function (promises) {
return new MyPromise((resolve, reject) => {
// must be iterable promises
if (isIterable(promises)) {
for (let p of promises) {
MyPromise.resolve(p).then(resolve, reject)
}
}
})
}
MyPromise.all = function (promises) {
return new MyPromise((resolve, reject) => {
// must be iterable promises
if (isIterable(promises)) {
const len = promises.length
// empty iterable
if (len === 0) {
resolve([])
}
// iterable
let result = new Array(len)
let count = 0
for (let i in promises) {
MyPromise.resolve(promises[i])
.then((value) => {
count++
result[i] = value
if (count === len) {
resolve(result)
}
}).catch(reject)
}
}
})
}