配列に存在するシンボルのデータを取得する機能について取り組んでいます。以下のコードを見てください。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");
}
});
}
}
お返事ありがとう@MikeC。私は今foreachループを使用しています。今後の使用のために他の解決策を理解してください。 – Jitesh
サンプルコードは平衡していません:21 '{'と22 '}'があります。 –