2012-03-03 20 views
0

基本的には、各シンボルを取得するために既存のarrtickersをループしたいnode.js非同期の問題?

次に、各シンボルURLの内容を読み込んで内容をローカルディレクトリに保存します。

phpでは、各ティッカーと各シンボルをステップごとに印刷します。

しかし、ノードでは、シーケンスが混乱しています。それは最初にすべてのurl_optionableを出力します

...その後

時々印刷はconsole.log( 'パス:' +ファイル)、時々プリントはconsole.log( "ファイルが保存されました!");

毎回はfs.writefile機能を介して実行、SYM値が検出されないZeissSが正しいとMSN-.htmlを

for(var v=0;v<arrtickers.length;v++) 
{ 
    var arrticker= arrtickers[v].split('@@'); 
    var sym= $.trim(arrticker[1]); 

    url_optionable= "http://sample.com/ns/?symbol="+sym; 

    console.log('url_optionable: ' + url_optionable); 

    request({ uri:url_optionable }, function (error, response, body) { 
     if (error && response.statusCode !== 200) { 
     console.log('Error contacting ' + url_optionable) 
     } 

     jsdom.env({ 
     html: body, 
     scripts: [ 
      jqlib 
     ] 
     }, function (err, window) { 

     var $ = window.jQuery; 
     var data= $('body').html(); 

     var file= "msn-"+sym+".html"; 
     console.log('path: ' + file); 

     fs.writeFile(file, data, function(err) { 
      if(err) { 
      console.log(err); 
      } 
      else 
      { 
       console.log("The file was saved!"); 
       } 
     }); 
     }); 
    }); 
} 
+1

私が見ている問題はループです。コールバックが実行されるポイントで、ループが実行され、ループ内の変数に最後に実行された値が設定されます。クロージャを生成するには、 'arrtickers.forEach()'を使用します。 – ZeissS

+0

ありがとう、forEachは非同期のトリックです。 :) –

答えて

1

として、保存されたファイルはショーです。基本的に、forループの中で宣言された変数は、ループ内の最後の値に設定されるため、非同期呼び出しに対するコールバック関数では使用できません。あなたのコードでは、url_optionablesymarrtickers[arrtickers.length - 1]に対応します。

のどちらか(ZeissSが示唆するように)を使用します。

arrtickers.forEach(function(arrticker) { 
    // Get symbol and url, make request etc 
}); 

またはsymを取り、要求を行う関数を宣言し、あなたのループ内でそれを呼び出す:

個人的に
function getSymbol(symbol) { 
    // Request url and read DOM 
} 

for(var v=0;v<arrtickers.length;v++) { 
    var arrticker = arrtickers[v].split('@@'); 
    var sym = $.trim(arrticker[1]); 

    getSymbol(sym); 
} 

、私が選ぶだろうforEachソリューションの場合