【原文连接】 https://segmentfault.com/q/1010000007499416segmentfault
【注】 原文是一篇问答形式的帖子,此处作了小幅度整理; 本文转于此处,用于本人收藏,查找方便之用。若有侵权,请联系删除。数组
需求是有一个objects数组,其中的元素是每次异步事件须要的参数 异步事件事件接受参数而且串行执行,最终返回一个promise结果promise
Promise.all彷佛是并行的?bash
const PromiseForEach = (objects, asyncDosometing) => {
return new Promise((resolve, reject) => {
Promise.all(objects.map((obj) => {
return new Promise((resolve, reject) => {
return asyncDosometing(obj).then(resolve, reject);
});
})).then(resolve, reject);
});
};
复制代码
这样写彷佛也是并行的?异步
const PromiseForEach = (objects,asyncDosometing) => {
let result = Promise.resolve();
objects.forEach((obj) => {
result = result.then(asyncDosometing(obj));
});
return result;
}
复制代码
// 测试结果为
// 直接打印了“成功” data为undefined 以后 一次性打印出全部“number”
// 而不是 每隔2s打印一个number number都打印完后 打印成功 而且data应给是个number数组async
const list = [];
for (let i = 0; i < 100; ++i) {
list.push(i);
}
PromiseForEach(list, (number) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log(number);
return resolve(number);
}, 2000);
})
}).then((data) => {
console.log("成功");
console.log(data);
}).catch((err) => {
console.log("失败");
console.log(err)
});
复制代码
两种写法貌似有有问题呢
到是用async/await实现了 虽然不知道对不对啊 可是实现了预期测试
const PromiseForEach = async(objects, asyncDosometing) => {
let result = [];
for (let obj in objects) {
try {
result.push(await asyncDosometing(obj));
} catch (err) {
return err;
}
}
return result;
};
复制代码
请问用Promise实现这种逻辑的正确的写法是怎么样的?求解!谢谢!!!ui
第二种方式的正确的 runjs.cn/code/ilckww… 若是须要返回结果的话, 能够再加一层 Promisespa
const list = [];
for (let i = 0; i < 100; ++i) {
list.push(i);
}
复制代码
function PromiseForEach(arr, cb) {
let realResult = []
let result = Promise.resolve()
arr.forEach((a, index) => {
result = result.then(() => {
return cb(a).then((res) => {
realResult.push(res)
})
})
})
return result.then(() => {
return realResult
})
}
PromiseForEach(list, (number) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log(number);
return resolve(number);
}, 100);
})
}).then((data) => {
console.log("成功");
console.log(data);
}).catch((err) => {
console.log("失败");
console.log(err)
});
复制代码
result = result.then(() => {
return cb(a).then((res) => {
realResult.push(res)
})
})
复制代码