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

関連する問題