2016-10-17 10 views
0

配列に存在するシンボルのデータを取得する機能について取り組んでいます。以下のコードを見てください。Node.jsの配列の非同期処理

ループでforループを使用して配列を反復処理していますが、コード内のすべての計算がarraの最後の要素に対してのみ行われています(コードのコメントを確認してください)。私はこの問題の理由を100%確信しているわけではありませんが、Node.jsの非同期処理のためだと思います。

var symbol = ['symbol1', 'symbol2','symbol3']; 
    var today = new Date(); 
    var dd = today.getDate(); 
    var mm = today.getMonth() + 1; 
    var yyyy = today.getFullYear(); 
    if (dd < 10) { 
     dd = '0' + dd 
    } 
    if (mm < 10) { 
     mm = '0' + mm 
    } 
    var today1 = yyyy + '-' + mm + '-' + dd; 

    //for loop start 
    for (sname in symbol) { 
     sname = symbol[sname].substring(4); 
     sname1 = sname.replace("%26", '&'); 
     History.find({ "symbol": sname1 }, function(err, stock) { 
      if (err) { 
       next(); 
      } 
      if (stock != '') { 
       var objStr = stock[0].values.sort(custom_sort).reverse(); 
       objStr = JSON.stringify(objStr[0]); 
       var jsonObj = JSON.parse(objStr); 
       var date = new Date(jsonObj.Date); 
       var fromDate = date.date("YYYY-MM-DD"); 
       console.log(sname + ' and ' + sname1); //It should print symbol1,symbol2. 

       // But I am getting symbol3 all the time. 
       console.log(fromDate); 
       console.log(today1); 
       yahooFinance.historical({ 
        symbol: sname + '.NS', 
        from: fromDate, 
        to: today1 
       }, function(err, quotes) { 
        if (err) { 
         console.log("Error in fetching data"); 
        } 
        if (quotes == '') { 
          console.log("No latest records found to insert"); 
        } 
        for (var objCounter in quotes) { 
         var insertObj = { 
          'Date': quotes[objCounter].date.date("YYYY-MM-DD"), 
          'Open': quotes[objCounter].open, 
          'Close': quotes[objCounter].close, 
          'High': quotes[objCounter].high, 
          'Low': quotes[objCounter].low, 
          'AdjClose': quotes[objCounter].adjClose, 
          'Volume': quotes[objCounter].volume 
         }; 
         History.findOneAndUpdate({ symbol: sname1 }, { $push: { values: insertObj } }, { safe: true, upsert: true }, 
          function(err, model) { 
           if (err) { 
            console.log(err); 
           } else { 
            console.log("Record inserted for " + sname1) 
           } 
          } 
         ); 
        } 
       }); 
      } 
      else { 
       console.log("Not Found"); 
      } 
     }); 
    } 
} 
+0

お返事ありがとう@MikeC。私は今foreachループを使用しています。今後の使用のために他の解決策を理解してください。 – Jitesh

+0

サンプルコードは平衡していません:21 '{'と22 '}'があります。 –

答えて

0

あなたがアクセスしたいあなたの変数で)ただ、History.find(内部のコールバックメソッドを結合し、あなたの問題

を解決するためにbindを使用することができます。バインド後、を使用して変数にアクセスできます。キーワード

以下はサンプルコードです。

var symbol = ['symbol1', 'symbol2', 'symbol3'] 
var today = new Date() 
var dd = today.getDate() 
var mm = today.getMonth() + 1 
var yyyy = today.getFullYear() 
if (dd < 10) { 
    dd = '0' + dd 
} 
if (mm < 10) { 
    mm = '0' + mm 
} 
var today1 = yyyy + '-' + mm + '-' + dd 
// for loop start 
for (sname in symbol) { 
    sname = symbol[sname].substring(4) 
    sname1 = sname.replace('%26', '&') 
    History.find({ 'symbol': sname1 }, function (err, stock) { 

    //access your sname and sname1 
    var sname = this[0] 
    var sname1 = this[1] 
    if (err) { 
     next() 
    } 
    //your code.... 

    }.bind([sname,sname1])) //bind whatever variables you want to bind in this keyword with the callback function. 
} 
+0

返信いただきありがとうございます。私はこれを試してみましょう。私はforeachループを使用しました。 – Jitesh