我尝试将地图元素映射到[]以获取角度。但是,如果我检查对象的长度,则总为0。
var objects = [];
this.get().subscribe(
response => {
for (var i = 0; i < response.length; i++) {
objects.push(response[i]);
}
}
);
console.log(objects.length);
如果我console.log(objects),则显示屏幕
我做错了什么?
答案 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));