2013-12-14 5 views
0

Я новичок в Nodejs и асинхронном программировании. У меня возникла проблема с выполнением запроса GET внутри асинхронной функции. Здесь я размещаю весь код. Я пытаюсь вывести список всех Urls, добавить их в список и отправить список для обработки в другую функцию.NodeJS не может выполнить запрос GET асинхронно

Моя проблема заключается в обработке их. Inturn для каждого url Я выполняю запрос GET для извлечения тела и поиска элементов изображения в нем. Я хочу передать URL-адрес изображения стороннему api в качестве параметра GET. Я не могу выполнить запрос GET, поскольку элемент управления, похоже, вообще не доходит до него.

var async = require("async"), 
request = require("request"), 
cheerio = require("cheerio"); 


async.waterfall([ 

function(callback) { 
    var url = "someSourceUrl"; 
    var linkList = []; 
    request(url, function(err, resp, body) { 
     var $ = cheerio.load(body); 
     $('.list_more li').each(function() { 
      //Find all urls and add them to a list 
      $(this).find('a').each(function() { 
       linkList.push($(this).attr('href')); 
      }); 
     }); 
     callback(null, linkList); 
    }); 
}, 


//pass all the links as a list to callback 
function(liksListFetched, callback) { 
    for (var i in liksListFetched) { 
     callback(null, liksListFetched[i]); 
    } 
}], 

//***********My problem is with the below code************** 
function(err, curUrl) { 
    var cuResp = ""; 
    console.log("Currently Processing Url : " + curUrl); 

    request(curUrl, function(err, resp, body) { 

     var $ = cheerio.load(body); 
     var article = $("article"); 
     var articleImage = article.find("figure").children('img').attr('src'); 
     var responseGrabbed = "API response : "; 
     //check if there is an IMG element 
     if (articleImage === undefined) { 
      console.log("No Image Found."); 
      articleImage = 'none'; 
     } 
     else { 
      //if there is an img element, pass this image url to an API, 
      //So do a GET call by passing imageUrl to the API as a GET param 
      request("http://apiurl.tld?imageurl=" + articleImage, function(error, response, resp) {    //code doesn't seem to reach here 
       I would like to grab the response and concatenate it to the responseGrabbed var. 
       console.log(resp); 
       responseGrabbed += resp; 
      }); 
     } 
     console.log(responseGrabbed);// api response never gets concatenated :(
     console.log("_=_=_=_=_=_=__=_=_=_=_=_=__=_=_=_=_=_=__=_=_=_=_=_=_"); 
     process.exit(0); 
    }); 
}); 

Я ценю, если кто-нибудь может помочь мне понять основную причину. Заранее спасибо.

ответ

3

request() является асинхронным, поэтому, когда вы консоль входа строку, строка не была построена еще, вы должны сделать журнал консоли внутри обратного вызова:

request("http://apiurl.tld?imageurl=" + articleImage, function(error, response, resp) {        
    responseGrabbed += resp; 
    console.log(responseGrabbed);// api response never gets concatenated :(
    console.log("_=_=_=_=_=_=__=_=_=_=_=_=__=_=_=_=_=_=__=_=_=_=_=_=_"); 
}); 

То же самое для прекращения процесс, который должен быть выполнен, когда все запросы завершены.

+0

Привет. Быстрый вопрос. В этом случае не следует console.log (reap) регистрировать ответ? Извините, если я что-то упустил. –

+0

@EswarRajeshPinapala - он должен, если вы не получите ответа, вам нужно консольно зарегистрировать аргумент ошибки, чтобы узнать, что это говорит вам. – adeneo

+0

Неплохо, я убрал много вещей для публикации в вопросе, поэтому я испортил, когда внес изменения в исходный скрипт. Теперь я понимаю проблему и почему это работает. Благодаря тонну. –

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