[英]Javascript array length always is 0
這是由於代碼執行的異步特性。 subscription方法接受回調,這是您使用名為response的參數編寫的箭頭函數。
因此,回調不會立即執行,而是會在一段時間后執行。 但是,由於JS是異步的,因此它不會等待回調執行,而是會轉到代碼的下一行,其中變量仍為空數組。
如其他答案中所建議的那樣,您可以將控制台日志放在回調函數中以記錄期望值。
您正在執行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);
}
);
您正在記錄稍后設置的內容,因此預覽顯示一個空數組,但可以對其進行擴展。
日志將顯示當前的項目; 而不是登錄時的狀態。
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);
之后調用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
僅在回調中可用。
似乎訂閱代碼是異步的,因此您可以將其包裝成一個承諾。 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));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.