Возврат переменной из замыкания - PullRequest
0 голосов
/ 07 октября 2011

Как я могу получить возвращаемое значение этого. Что обратно из замыкания?Вместо:

this.setCanvas = function(files){
  var numItems = files.length - 1;
  this.items = {};

  var i = 0;
  for(i=0;i<=numItems;i++)
  {
    var file = files[i];
    var reader = new FileReader(); 

    reader.onload = (function(i) { 
      return function(e) { 
        var something = that.whatever();
        items[i] = something;
      }; 
    })(i);  

    reader.readAsDataURL(file);
  }

console.log(items); 
}

мне нужны элементы [i], определенные.Если я утешаю элементы [i] за пределами замыкания, он не определен.

Ответы [ 3 ]

2 голосов
/ 07 октября 2011

Проблема не в закрытии ; , это обратный вызов . Все, что нужно для использования значения that.whatever, должно выполняться в обратном вызове.

1 голос
/ 07 октября 2011

Вы можете дополнить свой код, чтобы отслеживать количество загруженных файлов.Таким образом, когда последний файл был загружен, вы можете вызвать конечный обработчик завершения:

  this.setCanvas = function(files) {
    var numItems = files.length - 1;
    var itemsLoaded = 0; // Initialize to zero

    var items = [];

    var i = 0;
    for(i=0;i<=numItems;i++) {

      var file = files[i];
      var reader = new FileReader(); 

      reader.onload = (function(i) { 
        return function(e) { 
          var something = that.whatever();
          items[i] = something;

          if(++itemsLoaded == numItems) {
            // At this point all files will have been loaded.
            allLoaded();
          }
        }; 
      })(i);  

      reader.readAsDataURL(file);
    }

    function allLoaded() {
      // Now we can analyze the results
      console.log(items); 
    }
  }

Я также изменил items на Array вместо Object.

Также, если вы хотите быть немного умнее, вы можете уменьшить numItems и проверить на ноль вместо создания новой переменной itemsLoaded.

0 голосов
/ 07 октября 2011

Есть пара вещей, которые вы должны изменить здесь. Сначала установите this.items в массив. Затем назначьте это себе, чтобы на него можно было ссылаться в закрытии Затем назначьте что-то для self.items [i] вместо items [i]. Наконец используйте this.items в console.log

this.setCanvas = function(files){
  var self = this;
  var numItems = files.length - 1;
  this.items = [];

  var i = 0;
  for(i=0;i<=numItems;i++)
  {
    var file = files[i];
    var reader = new FileReader(); 

    reader.onload = (function(i) { 
      return function(e) { 
        var something = that.whatever();
        self.items[i] = something;
      }; 
    })(i);  

    reader.readAsDataURL(file);
  }

    console.log(this.items); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...