2017-11-25 191 views
1

我正在學習如何爲個人項目執行爬網程序(使用'cheerio')。爬行本身工作正常,但不知何故我正在構建的對象(eventDetails)沒有被返回。您可以在下面看到,在函數級別聲明的對象已正確填充請求,但不在其外部。你能幫忙嗎?謝謝。Javascript函數不返回對象

function crawlEventDetails(eventLink){ 
    var eventDetails = new Object(); 
    //console.log(eventLink); 
    request(urlDomain + eventLink, function(err, response, html) { 
     if(err){ 
      console.log(err); 
     } 
     else { 
      var $ = cheerio.load(html); 
      eventDetails.date = $('.detail.textsmall').eq(0).text(); 
      eventDetails.time = $('.detail.textsmall').eq(1).text(); 
      eventDetails.place = $('.detail.textsmall').eq(2).text(); 
      eventDetails.price = $('.detail.textsmall').eq(3).text(); 
      console.log(eventDetails); //OK! 
     } 
    }); 
    console.log(eventDetails); //empty! 
    return eventDetails; // empty! 
} 
+1

花點時間瞭解回調函數。網上有很多可用的資源。 –

+0

是的,我試圖使用回調和/或研究異步/等待沒有成功。我會做更多的研究,謝謝。 – user3250118

回答

1

在異步函數可以完成之前,您正在返回對象。看看發送一個處理程序。即:

function crawlEventDetails(eventLink, handler){ 
    var eventDetails = new Object(); 
    //console.log(eventLink); 
    request(urlDomain + eventLink, function(err, response, html) { 
     if(err){ 
      console.log(err); 
     } 
     else { 
      var $ = cheerio.load(html); 
      eventDetails.date = $('.detail.textsmall').eq(0).text(); 
      eventDetails.time = $('.detail.textsmall').eq(1).text(); 
      eventDetails.place = $('.detail.textsmall').eq(2).text(); 
      eventDetails.price = $('.detail.textsmall').eq(3).text(); 
      console.log(eventDetails); //OK! 

      handler(eventDetails); // Send aka "return" to handler 
     } 
    }); 
} 

// call `crawlEventDetails()` function, and 
// send an anonymous function to handle the response 
crawlEventDetails(something, function(details){ 
    console.log(details); 
}); 
+0

我試過這一次,如果我管理它,我會讓你知道它是否工作。謝謝。 – user3250118