2017-10-10 123 views
0

我遇到問題,可觀測Lambda表達式中給數組賦值。Lambda表達式「不能正常工作」

我有一類具有這種屬性:

usuarios: Usuario[]; 

我注入的Http服務。

我有下列的函數:

getUsuarios(): Usuario[] { 

    this._http.get("http://localhost:3000/db").map(data => data.json()).subscribe(data => { 
     this.usuarios = data["Usuarios"]; 
     console.log(this.usuarios); 
    }); 

    console.log(this.usuarios); 

    return this.usuarios; 
    } 

對於一些reasong,壽,在控制檯中,與第一控制檯日誌(lambda表達式內的一個)完全示出了數據。

但是如果我再次登錄控制檯,這次在lambda表達式之外,this.usuarios是空的(undefined)。

這是爲什麼發生?

+2

http.get函數是異步的,所以getUsuarios()在http調用完成之前返回它的結果,這就是爲什麼它返回null。您可能想要返回observable而不是數組。 – Ploppy

回答

1

它確實工作正常,預計控制檯輸出應該是:

undefined
...some data

的是,HTTP發出異步調用意味着第一的console.log()不執行的理由直到您收到來自http請求的響應。
第二個console.log()與http請求不在同一個作用域內,因此它首先被執行。您可以閱讀更多與您的問題here相關的信息。

+0

有什麼方法可以知道異步執行何時完成?類似於C#中的_await_運算符。 – RottenCheese

+0

當異步執行完成時,執行: '.subscribe(data => {//這裏你可以對數據做一些事情}} – Andresson

+0

好吧,只是一個更愚蠢的問題。如果我不訂閱_Observable_,http請求是否仍然發送?我的意思是,我會從服務器得到一個響應,但沒有發生任何事情,因爲我沒有訂閱_Observable_,對吧?我會在_Observable_中保留響應,對吧?那就是我的意思。或者一旦我訂購了_Observable_,它就會被髮送出去?我不知道我是否足夠好解釋自己。 – RottenCheese