我的问题是,我绑定到异步函数的数组在该函数的后续调用中似乎不会得到更新,即使bind'ed数组在该函数内部已更新也是如此。
在下面的函数中,我多次异步调用queryForData。传递在全球范围内宣布的历史记录。 LOG1总是打印出一个空数组,而LOG2总是打印出使用该迭代的正确数据检索的数组。但是,它似乎与其他调用中检索到的数组没有联系。
请帮忙
exports.callQuery = function(req, res) {
var http = require('http');
var history = [];
// loop over all entries in "Stocks" collection
// and call queryForData
Stocks.find(function (err, stocks){
stocks.forEach(function callback(entry){
queryForData(entry, this.history);
}.bind({history : history})
);
});
// perform an HTTP request for data and call the callback
// function which concats the data arrays together.
var queryForData = function(stockData, history) {
var options = {
host: 'query.blah.com',
path: '/blah'+stockData
};
var callback = function(response) {
var str = '';
//another chunk of data has been received, so append it to `str`
response.on('data', function (chunk) {
str += chunk;
});
//the whole response has been received, so we just print it out here
response.on('end', function () {
var data = JSON.parse(str);
console.log("LOG1: ", this.stocksHistoryData);
this.stocksHistoryData = this.stocksHistoryData.concat(data);
console.log("LOG2: ", this.stocksHistoryData);
}.bind({stocksHistoryData : history})
);
};
http.request(options, callback).end();
};
};
最佳答案
concat()
返回一个新数组。因此,您将使用该函数范围之外无法访问的新数组覆盖对该数组的引用。它发生在这里:
this.stocksHistoryData = this.stocksHistoryData.concat(data);
尝试将以上行替换为:
data.forEach(function(item){
this.stocksHistoryData.push(item);
}, this);
这样,您始终可以建立现有阵列的状态。
关于javascript - JS绑定(bind)会获取obj的状态还是保留对obj的引用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21491829/