JavaScript数组长度始终为0

时间:2018-11-14 11:47:26

标签: javascript angular

我尝试将地图元素映射到[]以获取角度。但是,如果我检查对象的长度,则总为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 :(得分:1)

这是由于代码执行的异步特性。 subscription方法接受回调,这是您使用名为response的参数编写的箭头函数。

因此,回调不会立即执行,而是会在一段时间后执行。但是,由于JS是异步的,因此它不会等待回调执行,而是会转到代码的下一行,其中变量仍为空数组。

根据其他答案的建议,您可以将控制台日志放在回调函数中以记录期望值。

答案 1 :(得分:0)

您正在做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);
  }
);

答案 2 :(得分:0)

您正在记录稍后设置的内容,因此预览显示一个空数组,但是您可以展开它。

日志将显示当前的项目;而不是您登录时的状态。

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);

如果您的值以后可以解析一次,则可以使用Promises,但您似乎订阅了一个可以解析多次的事件,因此response仅在回调中可用。 / p>

答案 3 :(得分:-1)

似乎订阅代码是异步的,因此您可以将其包装成一个承诺。 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));