Async.forEach并行运行,但它正在丢失原始数组中的排序顺序
我试图并行迭代一个集合,我正在使用async.forEach(),但我也需要维护排序顺序。
async.forEach(books, function (book, bookCallback) {
findBook(account, userinfo, permission, function (error, foundBook) {
if (error) {
bookCallback(error);
} else if (foundBook) {
bookCallback(account);
bookCallback(null);
} else {
bookCallback(null);
}
});
}, function (err) {
if (err) {
callback(err, null);
} else {
callback(null, finaCallback);
}
});
我尝试过async.map,async.groupBy,但即使他们没有维护排序顺序。只有当我尝试使用async.eachSeries订单时,它才会被维护,但它并没有并行运行。
回答如下:我不确定async
来自哪个库,但假设您使用的是现代版本的节点,则不需要特殊的库来处理异步调用。这是你可以做的:
async function getBooks() {
let result = await Promise.all(books.map(book => {
return new Promise((resolve, reject) => {
findBook(account, userinfo, permission, function (error, foundBook) {
if (error) {
reject(error);
} else if (foundBook) {
resolve(account);
} else {
resolve(null);
}
});
});
return result;
}
并且result
将是与原始books
数组相同顺序的结果数组。
getBooks
函数返回一个被拒绝或已解决的承诺。如果我正确理解你的问题,这应该解决它。
Async.forEach并行运行,但它正在丢失原始数组中的排序顺序
我试图并行迭代一个集合,我正在使用async.forEach(),但我也需要维护排序顺序。
async.forEach(books, function (book, bookCallback) {
findBook(account, userinfo, permission, function (error, foundBook) {
if (error) {
bookCallback(error);
} else if (foundBook) {
bookCallback(account);
bookCallback(null);
} else {
bookCallback(null);
}
});
}, function (err) {
if (err) {
callback(err, null);
} else {
callback(null, finaCallback);
}
});
我尝试过async.map,async.groupBy,但即使他们没有维护排序顺序。只有当我尝试使用async.eachSeries订单时,它才会被维护,但它并没有并行运行。
回答如下:我不确定async
来自哪个库,但假设您使用的是现代版本的节点,则不需要特殊的库来处理异步调用。这是你可以做的:
async function getBooks() {
let result = await Promise.all(books.map(book => {
return new Promise((resolve, reject) => {
findBook(account, userinfo, permission, function (error, foundBook) {
if (error) {
reject(error);
} else if (foundBook) {
resolve(account);
} else {
resolve(null);
}
});
});
return result;
}
并且result
将是与原始books
数组相同顺序的结果数组。
getBooks
函数返回一个被拒绝或已解决的承诺。如果我正确理解你的问题,这应该解决它。