2017-01-18 7 views
0

cheeriorequestのWebscraperを作成しましたが、今はURLの配列にループを実装しようとしています。Javascript/NodeJSコールバック関数とループ

残念ながら、私はコールとコールバックで何か間違っていますが、私は何が分かりません。

この私のコードです:私のデバッグプリントのいずれよりも

var getWebData = function(url) { 
    var i = 1; 
    var data = []; 
    for (c = 0; c < url.length; c++) { 
    data[i] = request(url[c], function(err, resp, body) { 
      console.log('ok'); 
      if (!err) { 
      console.log('there'); 
      var $ = cheerio.load(body); 
      $('.text').each(function(i, element) { 
       var jsObject = { name : "", description : "", price: "", categorie: "", pricePerKg: "", capacity: "", weight: "", scrapingDate : "", url: ""}; 
       var name = 'TESTOK'; 
       jsObject.name = name; 
       data.push(jsObject); 
      }) 
      return data; 
     } 
     console.log('but'); 
     }); 
    i++; 
    } 
    var json = JSON.stringify(data); 
    fs.writeFile('output.json', JSON.stringify(json, null, 4), function(err) { 
     console.log('File successfully written!'); 
    }) 
} 

getWebData(url); 
app.listen('8080'); 

注意が印刷されません。

誰かが自分のコードで何が間違っているのか知っていますか?それを動作させるにはどうすればよいですか?

+0

は 'url'リストですか? – eLRuLL

+0

"私のデバッグの印刷物が印刷されていることに注意してください..." - 何が印刷されていますか?また、非同期性を考慮していないため、 'data'は' JSON.stringify(data) 'で定義されていません。 –

+0

urlは@lLuuLLのURLです@eLRuLL – rastafalow

答えて

1

要求は、ループの実行をcompletetes、データオブジェクトを移入する前に、この上のコードが実行Aysnc

var json = JSON.stringify(data); 
fs.writeFile('output.json', JSON.stringify(json, null, 4), function(err) { 
    console.log('File successfully written!'); 
}) 

あります。 ループ完了実行時にこのコードを実行してみてください。

実行このコマンドは最初のNPMは、私はアシフの回答やコメントを読んでてきた

var async = require('async'); 

    var getWebData = function(url){ 
    var data = []; 
    async.eachSeries(url, function(urlSingle , cb){ 
     request(urlSingle, function(err, resp, body) { 
     //write your logic here and push data in to data object 
     cb(); 
     }) 
    },function(){ 
    // this will rum when loop is done 
    var json = JSON.stringify(data); 
     fs.writeFile('output.json', JSON.stringify(json, null, 4),   function(err) { 
      console.log('File successfully written!'); 
     }); 
    }); 
    } 
+0

あなたの回答をありがとうございます。Asif Saeed、どうすればいいですか? – rastafalow

+0

更新された回答を確認してください –

+0

ありがとうございますAsif、どこで私のC変数を増やす必要があるのですか?私が推測する要求のうち、電話? – rastafalow

1

--save非同期をインストールします。その実装は正しかったですが、c変数をインクリメントする必要はありません。また、前にc = 0を開始すると、すべてのリクエストがurl [0]になります。 async.eachSeriesは「urlsingle」コールバックでのアレイのURLの各要素をコールバックするので、あなたは

request(urlsingle, ... 

またはあなたの配列の各要素のインデックスを与えるasync.eachOfを使用することを検討してを使用する必要があることを

ノート。ループ内

var async = require('asycn'); 
async.map(url, 
function(item, callback) { 
    data[i] = request(url[c], 
    function(err, resp, body) { 
     console.log('ok'); 
     if (!err) { 
      console.log('there'); 
      var $ = cheerio.load(body); 
      $('.text').each(function(i, element) { 
       var jsObject = { 
        name: "", 
        description: "", 
        price: "", 
        categorie: "", 
        pricePerKg: "", 
        capacity: "", 
        weight: "", 
        scrapingDate: "", 
        url: "" 
       }; 
       var name = 'TESTOK'; 
       jsObject.name = name; 
       data.push(jsObject); 
      }) callback(err, data); 
     } 
     console.log('but'); 
    }); 
    i++; 
},function(err, results) { 
    if(err){ 
     console.log(err); 
    } 
}); 

がoperation.youは、非同期操作を使用する必要があり時間がかかる:あなたはこのように変更する必要があります疑問http://caolan.github.io/async/

0
for (c = 0; c < url.length; c++) { 
    …… 
} 

ための非同期ドキュメントの

チェック。

関連する問題