【问题标题】:how to force execution of requests inside async.each with nodejs?如何使用nodejs强制执行async.each中的请求?
【发布时间】:2018-02-09 13:45:55
【问题描述】:

我有一个 async.each 迭代一个数组,并且对于数组中的每个元素,它执行一个内部有请求的函数“检查”。这是代码,但是当我运行它时,我从调试器中看到节点没有执行检查功能并且它阻止了它的执行。

async.each(array,
  function(v_page, callback){
    if(v_page.url.length>=5){
      internals.check(v_page.url,array2, function (body) {
        callback();
      });
    }
  },
  function(err){
    internals.calls(var1,var2,var3);
});

我尝试了一个普通的 for 循环,但它跳转到了 internals.calls 函数,而没有执行 internals.check 函数来了解节点的异步性质。那么如何强制执行检查功能呢?

这是检查函数的代码:

internals.check = (url,array2,cb) => {
  request(url, function(err, recordset) {
    if(err){
      cb(array2);
    }else {
      //some stuffs
      cb(array2)
    }
  });
};

【问题讨论】:

    标签: javascript node.js foreach async.js requestjs


    【解决方案1】:

    您仅在v_page.url.length >= 5 时调用callback,但您需要为每个元素都这样做:

    async.each(array, function(v_page, callback) {
     if(v_page.url.length >= 5) {
       internals.check(v_page.url,array2, function(body) {
         callback();
       });
     } else {
       callback(); <== call callback here, when condition is not met
     }
     ...
    

    另一个问题是,您在internals.check 中错误地调用了回调。根据 Node.js 的表示法,回调的第一个参数必须是错误或 null(异步使用这种表示法)。但在你的情况下,无论如何你都用array2 调用回调:

    internals.check = (url, array2, cb) => {
      request(url, function(err, recordset) {
        if (err) {
          cb(err); // <== pass error here
        } else {
          cb(null, array2); // <== no error, so first parameter is null, the second is data
        }
      });
    };
    

    【讨论】:

    • 谢谢,我添加了它,但没有任何改变,最重要的是我没有解决问题......它没有执行检查功能。
    • 更新了答案,internals.check 函数有 bug。
    • 好的,我修复了回调错误,但是从调试器中我看到它进入了检查函数,当它到达请求时,它跳转到函数的末尾,所以它看不到回调CB。我认为这就是问题所在。
    • 当然it jumps到最后,因为request是`asynchronous_函数,它立即返回,稍后返回,当数据加载时,调用callback。
    • 所以没有解决办法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 2020-04-20
    • 2018-11-29
    • 1970-01-01
    相关资源
    最近更新 更多