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

时间:2015-03-24 18:09:09

标签: javascript node.js asynchronous

遇到问题,感谢任何帮助。

我试图将所有异步功能收集在一起。 尝试了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"功能。代码看起来比第一版更好,但仍然拒绝正常工作。

2 个答案:

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