Node.js 中使用异步模块的问题

issue using async module in Node.js

遇到问题,感谢您的帮助。

我正在尝试将所有异步函数集中在一起。 尝试了 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.:我已经更新了几次代码。在这个例子中,我尝试使用 async.parallel。问题是即使我没有出错,我仍然没有进入 "getLocations" 函数。代码看起来比第一个版本好得多,但仍然无法正常工作。

您的 gethtml 函数中有几个问题需要修复。

确保现在 return 在任何地方都可以调用回调,例如

return callback(err)  

当您想传达错误或

return callback(null,  result) 

当您想传达成功和 return 结果时。永远不要 return 不调用回调。

而不是在浏览时删除 parser.allHrefs。您应该重构 de getHtml 以了解是否可以添加 link。像这样:

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 函数时,您会检查是否添加 link 或不像这样:

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