关于对异步处理的理解,可以参考从小小题目逐步走进 JavaScript 异步调用
// 如果你用 node 的话,可以用 util.promisify 来封装 node 回调风格调用
// 或者就自己写一个
function updateTaskLastMile(...args) {
return new Promise((resolve, reject) => {
taskMainRepo.updatetasklastmile(...args, (err, data) => {
if (err) {
reject(err);
} else {
resolve(data);
}
});
});
}async function main() {
const bb = [];
const promises = bb.map(b => updateTaskLastMile(b));
// 这个 aa 就是你想要的
const aa = await Promise.all(promises);
}
但是上面这个 main 必须要每个 bb 的调用都成功才会返回也就是说,对于 Promise.all,如果有一个失败,必定全部失败。那么可以这样改写(参阅从不用 try-catch 实现的 async/await 语法说错误处理):
async function main() {
const bb = [];
// 注意这里加的 .catch
const promises = bb.map(b => updateTaskLastMile(b).catch(err => false));// 这个 aa 就是你想要的
const aa = await Promise.all(promises);
}
这样,如果有调用失败,aa 中对应的元素就是 false,当然你也可以使用其它容易识别的值,比如 null、undefined 或者某个特殊值,甚至可以干脆对返回值进行一次封装
const promises = bb
.map(b => updateTaskLastMile(b)
.then(data => ({ data }), err => ({ err })));
这样,aa 中的每个元素都是一个对象,要么有 data 属性,要么有 err 属性……