在Node.js中异步处理数组

Async processing of an array in Node.js

本文关键字:处理 数组 异步 Node js      更新时间:2023-09-26

我正在研究为数组中存在的符号获取数据的功能。请看看下面我的代码。

我正在使用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.
}