3

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

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)
    }
  });
};
4

1 回答 1

4

callback只调用 when v_page.url.length >= 5,但您需要为每个元素执行此操作:

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
    }
  });
};
于 2017-08-31T14:46:53.240 回答