遇到问题,感谢任何帮助。
我试图将所有异步功能收集在一起。 尝试了async.parallel,async.each,gather-gm。没有什么能让最终的回调发挥作用。 这是更新后的代码(但工作不正常):
var calls = [];
async.each(parser.allHrefs,function (href,callback) {
getHtml(href,function(err, add){
console.log("Passing data: " + href);
if(err){
return callback(err);
};
if(add){
calls.push(href);
};
return callback();
});
}, function (err) {
if(err){
console.log('something went wrong');
}else{
console.log('finished');
};
});
第一个功能:
function getHtml(link, callback) {
httpreq.get(link, function(err, res) {
if(err) {
return callback(err);
}
if(res.statusCode >= 300) {
return callback(null, false);
} else {
//cut parsing code here...
return callback(null, true);
}
});
}
p.s.:I'已多次更新代码。在这个例子中,我试图使用async.parallel。事情是,当我甚至没有错误,我仍然没有得到" getLocations"功能。代码看起来比第一版更好,但仍然拒绝正常工作。
答案 0 :(得分:1)
您需要修复gethtml函数中的几个问题。
确保您现在返回的所有地方都可以调用回调,例如
return callback(err)
当您想要传达错误或
时return callback(null, result)
当您想要传达成功并返回结果时。如果不调用回调,就永远不要回来。
答案 1 :(得分:0)
而不是在您通过它时删除parser.allHrefs
。您应该重构de getHtml
只是为了知道您是否可以添加链接。像这样:
function getHtml (link, callback) {
httpreq.get(link, function(err, res) {
//the request has already finished executing here
if(err) {
return callback(err);
}
if(res.statusCode >= 300) {
return callback(null,false);
} else {
//cut parsing code here...
return callback(null,true);
}
});
};
这样当您调用gatherSecondLevelData
函数时,您会检查是否添加链接:
function gatherSecondLevelData (err) {
var calls = [];
async.each(parser.allHrefs,function (href,callback) {
getHtml(href,function(err, add){
if(err){
return callback(err);
};
if(add){
calls.push(href);
};
return callback();
});
}, function (err) {
if(err){
console.log('something went wrong');
}else{
console.log('finished');
};
});
};