// 模拟请求
function p1 () {
return new Promise(resolve => {
setTimeout(() => {
console.log('p1 ok')
resolve('data p1')
}, 500);
})
}
function p2 () {
return new Promise(resolve => {
setTimeout(() => {
console.log('p2 ok')
resolve('data p2')
}, 500);
})
}
function p3 () {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('p3 ok')
reject('data p3 fail')
}, 500);
})
}
async function promiseAll(...ps) {
async function *foo() {
while(true) {
try{
let res = await (yield)()
yield res
} catch(e) {
yield Promise.reject(e) // 错误处理
}
}
}
function go(gen) {
let it = gen()
it.next()
return it
}
let res = Promise.resolve([])
let it = go(foo) // 启动并获取操作权柄
for (let p of ps) {
let r = await it.next(p)
it.next()
res = res.then(v => Promise.resolve([...v, r.value]) )
}
return res
}
async function test() {
let r = await promiseAll(p1, p2, p3).catch(e=>console.log(e))
console.log(r)
}
test()
Promise.all([p1(),p2(), p3()]).then(r => {
console.log(r)
}).catch(e => {
console.log(e)
})
ps:补充错误处理