2017-11-25 131 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