我的问题是,我绑定到异步函数的数组在该函数的后续调用中似乎不会得到更新,即使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/

10-13 00:05