2017-08-31 59 views
3

我有一个async.each迭代一个数组,并为数组内的每个元素执行一个函数“检查”,其中有一个请求。这是代码,但是当我运行它时,我从调试器看到该节点不执行检查功能,并且阻止其执行。如何强制使用nodejs执行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); 
}); 

我试图用一个正常的循环,但它在internals.calls功能跳不执行internals.check功能节点的异步性质。那么我如何强制执行检查功能呢?

这是检查功能的代码:

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

回答

4

你叫callback只有当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 
    } 
    }); 
}; 
+0

谢谢,我加了,但没有任何改变,首先我没有解决的问题......它不执行检查功能。 –

+0

更新了答案,您在'internals.check'函数中有一个错误。 – alexmac

+0

好的我修复了回调错误,但是从调试器中我看到它进入了检查函数内部,并且当它到达请求时,它跳转到函数的末尾,所以它看不到回调cb。我认为这是问题。 –