Длина массива Javascript всегда равна 0 - PullRequest
0 голосов
/ 14 ноября 2018

Я пробовал элементы карты в [] для угловых.Но если я проверил длину объектов, то всегда отображается 0 ..

var objects = [];

this.get().subscribe(
  response => {
    for (var i = 0; i < response.length; i++) {
      objects.push(response[i]);
    }
  }
);
console.log(objects.length);

enter image description here

, если я console.log (objects)

Что я делаю не так?

Ответы [ 4 ]

0 голосов
/ 14 ноября 2018

Кажется, что код подписки асинхронный, так что вы можете завершить это обещанием. result это objects вы хотите

const promise = new Promise((resolve, reject) => {
  var objects = [];
  this.get().subscribe(response => {
    for (var i = 0; i < response.length; i++) {
      objects.push(response[i]);
    }
    resolve(objects);
  });
});

promise.then(result => console.log(result));
0 голосов
/ 14 ноября 2018

Вы регистрируете что-то, что будет установлено позже, поэтому предварительный просмотр показывает пустой массив, но вы можете развернуть его.

В журнале будет отображаться элемент как он есть сейчас; не так, как когда вы входите в систему.

var arr = [];
console.log(arr);//shows [] but when you expand it it shows items
arr.push({name:'john'});

Если вы хотите видеть значения объекта во время регистрации объекта и планируете изменять его после журнала, вы можете сделать следующее:

console.log(JSON.stringify(object,undefined,2);

Ваш оператор objects.push(response[i]); находится в обратном вызове, и этот обратный вызов, вероятно, вызывается после вашего console.log(objects.length);. Это можно доказать, добавив еще один журнал:

var objects = [];

this.get().subscribe(
  response => {
    console.log('second log')
    for (var i = 0; i < response.length; i++) {
      objects.push(response[i]);
    }
  }
);
console.log("first log",objects.length);

Если у вас есть значение, которое разрешается один раз позднее, вы можете использовать Обещания, но похоже, что вы подписываетесь на событие, которое может разрешаться несколько раз, поэтому ваш response будет доступен только в обратном вызове.

0 голосов
/ 14 ноября 2018

Это связано с асинхронным характером выполнения кода.Метод подписки принимает обратный вызов, который является функцией стрелки, которую вы написали с параметром с именем response.Таким образом, обратный вызов не будет выполнен немедленно, но будет выполнен через некоторое время.Но, поскольку JS является асинхронным, он не будет ждать выполнения обратного вызова и перейдет к следующей строке кода, где переменная по-прежнему будет пустым массивом.Как предлагается в других ответах, вы можете поместить журнал консоли в функцию обратного вызова, чтобы записать ожидаемое значение.

0 голосов
/ 14 ноября 2018

Вы делаете console.log до получения ответа в подписке.Просто переместите console.log внутри подписки.

var objects = [];

this.get().subscribe(
  response => {
    for (var i = 0; i < response.length; i++) {
      objects.push(response[i]);
    }
    console.log(objects.length);
  }
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...