簡體   English   中英

JavaScript數組長度始終為0

[英]Javascript array length always is 0

我嘗試將地圖元素映射到[]以獲取角度。 但是,如果我檢查對象的長度,則總為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)

我做錯了什么?

這是由於代碼執行的異步特性。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM