最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

Async.forEach并行运行,但它正在丢失原始数组中的排序顺序

IT培训 admin 5浏览 0评论

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函数返回一个被拒绝或已解决的承诺。如果我正确理解你的问题,这应该解决它。

发布评论

评论列表 (0)

  1. 暂无评论