在Node.js中异步处理数组
Async processing of an array in 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");
}
});
}
}
您可以使用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.
}
相关文章:
- 在JavaScript中处理数组和对象时需要帮助
- Emberjs#每个循环不处理数组数据
- 如何在angular js/HTML中处理数组
- 按子数组处理数组
- 处理数组的 Ajax 表单
- 使用 Google Apps 脚本处理数组中输入元素中的多个文件
- JavaScript for in - 从主对象获取、组合和处理数组
- 在 JavaScript 中处理数组中的最后一项
- 处理数组中的元素,考虑到元素的索引,它们的长度不同
- ngResource + 401 错误处理:数组或对象的预期响应
- 使用 join() 批量处理数组
- JavaScript提取并处理数组中的值
- 用于处理数组的Javascript
- 承诺获取和处理数组
- 类似sql的javascript库,用于处理数组和对象
- 在javascript和jquery中处理数组中的对象
- 尝试训练如何处理数组
- 使用reduce方法处理数组元素
- js serialize()可以处理数组字段名吗?
- Jquery美元.每个循环处理数组