2016-10-17 6 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 loop на данный момент. Понимая другие решения для будущего использования. – Jitesh

+0

Пример кода не сбалансирован: существует 21 '{' и 22 '}'. –

ответ

0

Вы можете использовать bind, чтобы решить вашу проблему

Просто связать метод обратного вызова внутри History.find() с переменными, которые вы хотите получить доступ. После связывания вы можете получить доступ к своим переменным, используя . ключевое слово

Ниже приведен пример кода.

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

Спасибо Ayush за ответ. Я дам этому попытку. Сейчас я использовал foreach loop. – Jitesh

Смежные вопросы