【问题标题】:async parallelLimit runs limit times only onceasync parallelLimit 只运行一次限制次数
【发布时间】:2021-01-09 22:39:33
【问题描述】:

我正在尝试使用 async.parallelLimit 来更新我的数据库中的记录。我需要分批执行 10 次,每次总记录为 1000 条。我试图了解如何在我的代码中使用这个 asyn.parallelLimit。我查看了一些示例解释并尝试了,但它只运行了 10 次,并且在返回 10 个响应后它没有给我下一个响应。我试图通过执行过滤器来查询数据库,然后将记录发送到 async.parallelLimit 并获取所有这些记录的响应。现在我只是想了解parallelLimit 及其工作。这是我的代码

const async = require("async");

module.exports = async (server) => {
  async function data(server) {
    return await resolveData(server);
  }

  function resolveData(server) {
    return new Promise((resolve) => {
      let parcel = server.models["Parcel"].find({
        order: "createdAt ASC",
        include: [
          {
            relation: "parcelStatuses",
          },
          {
            relation: "customerData",
            scope: {
              fields: ["firstName", "lastName", "cityId", "customerId"],
            },
          },
        ],
        limit: 1000,
        skip: 200,
      });
      resolve(parcel);
    });
  }
  // console.log(await data(server));
  var parcelData = await data(server);

  for (var i = 1; i <= parcelData.length; i++) {
    parcelData[i - 1] = (function (i) {
      return function () {
        console.log(i);
      };
    })(parcelData[i]);
  }

  async.parallelLimit(parcelData, 10, function (err, results) {
    if (results) {
      console.log("This is resilt", results);
    } else {
      console.log(err);
    }
  });
};

我需要我的 parallelLimit 函数来返回我的查询获取的记录。稍后我将运行更新命令。因为它只返回了 10 条记录,所以我想知道我做错了什么

【问题讨论】:

    标签: javascript node.js parallel-processing batch-processing async.js


    【解决方案1】:

    我不确定for loop 应该做什么。我猜您正在尝试为parcelData 的每个元素创建函数。一个简单的方法就是在parcelData 上使用map 并返回一个异步函数:

    let async = require("async");
    
    // Your data is here but I used a dummy array with 100 elements
    let parcelData = Array(100).fill(0).map((_, i) => i);
    
    // Just a dummy function to wait
    function delay(ms) {
        return new Promise(r => setTimeout(r, ms));
    }
    
    // map over array and return an `async` function;
    let tasks = parcelData.map(p => {
      return async () => {
        await delay(1000);
        console.log(p);
      }
    });
    
    // Finally execute the tasks
    async.parallelLimit(tasks, 10, (err, result) => {
        if (err) console.error('error: ', err)
        else console.log('done');
    });
    

    您可以在repl.it 上运行代码以查看它的实际效果。这是我制作的one

    【讨论】:

    • 是的,但您需要明确您想对这些记录做什么。你想通过速率限制来完成什么?
    • 酷,很高兴听到这个消息。
    • 我将对这些记录运行更新命令以在其中添加新属性
    • @ahsannissar,如果执行更新的函数返回一个承诺,那么您可以简单地返回承诺并删除async。喜欢:parcelData.map(p =&gt; yourUpdateFunctionThatReturnsPromise(p)).
    • @ahsannissar,我真的不知道,但我可以告诉你parallelLimit 不太可能施加这样的限制。 parallelLimit 只是一个您也可以自己编写的函数。似乎您的数据库可能没有刷新最新的架构迁移。我建议您再问一个特定于该数据库的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多