2015-03-24 4 views
0

Имея проблему, оцените любую помощь.выпуск с использованием асинхронного модуля в 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.:I've обновил раз код пару. В этом примере я попытался использовать async.parallel. И дело в том, что даже когда я даже не получаю ошибок, я до сих пор не добираюсь до функции getLocations. Код выглядит намного лучше, чем первые версии, но все же отказывается работать правильно.

+0

Вы уверены, что gethtml зовут обратный вызов? –

+1

Есть вероятность, что вы можете вызвать gethtml и не вызвать callback. Вы должны убедиться, что он ВСЕГДА выполняет «обратный вызов» независимо от результата. Если это ошибка, отправьте ошибку на обратный вызов. –

+0

'parallel' отличается от' each', потому что первый выполняет массив функций, а второй перемещается по массиву и выполняет ту же функцию для каждого элемента. Другое дело, что gethtml не возвращает значение, поэтому вы не нажимаете ничего на массив 'calls'. – Osukaa

ответ

0

Вместо того, чтобы удалять parser.allHrefs, пока вы проходите через него. Вы должны реорганизовать 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'); 
     }; 
    }); 
}; 
+0

Спасибо за консультацию. К сожалению, все еще есть та же проблема. Я не получаю ни ошибки, ни успеха. Данные передаются в getHtml успешно и до того, как я проверил синтаксический анализатор, он также делает именно то, что я ожидаю. Не могу понять, почему это не работает. – Lazyexpert

+0

, если вы положили 'console.log' в обратном вызове' getHtml', что вы получаете в параметрах 'err, add'? – Osukaa

+0

Ну, у меня было это (ошибка) в третьей функции, и это не сработало. Фактически, мне удалось достичь «законченного» сегодня, просто комментируя всю логику синтаксического анализа.Это уже победа;) Спасибо всем за помощь. – Lazyexpert

1

В вашей функции gethtml есть несколько проблем, которые необходимо исправить.

Убедитесь, что везде, где вы сейчас вернулись, вы вызываете обратный вызов, например.

return callback(err) 

когда вы хотите сообщить об ошибке или

return callback(null, result) 

когда вы хотите общаться успеха и возвращают результат. Никогда не возвращайтесь без вызова обратного вызова.

+0

Большое спасибо. Это имеет смысл. И мне удалось двигаться дальше. Ошибка была в 404 || 500. Что касается этого, я, вероятно, не должен возвращать его как ошибку, его общая ситуация с плохим URL-адресом, я полагаю? – Lazyexpert

+0

Ну, я не знаю ваших требований или используемого вами варианта использования. Это зависит от контекста того, что вы пытаетесь сделать, допустимо ли 404 или 500 для одного URL-адреса, и просто создает пустой результат или это условие, которое должно остановить всю обработку. – Reto

Смежные вопросы