2016-09-02 68 views
15

這是我想做的事。角2如何從訂閱返回數據

@Component({ 
    selector: "data", 
    template: "<h1>{{ getData() }}</h1>" 
}) 

export class DataComponent{ 
    this.http.get(path).subscribe({ 
     res => return res; 
    }) 
} 

如果getData被稱爲DataComponent裏面,你可以建議將其分配給一個變量像this.data = res並使用我喜歡{{data}}。但我需要像{{getData}}用我自己的purpose.Please建議我嗎?

回答

21

你不能直接返回值,因爲它是一個異步調用。 異步調用意味着當您的代碼繼續執行時,它將在後臺運行(實際上計劃在稍後執行)。

你也不能在類中直接使用這樣的代碼。它需要移入方法或構造函數。

你可以做的是不是subscribe()直接使用,但運營商像map()

export class DataComponent{ 
    someMethod() { 
     return this.http.get(path).map(res => { 
     return res.json(); 
     }); 
    } 
} 

此外,你可以用相同的觀測量組合多個.map因爲有時這提高了代碼的清晰度和讓事情分開。例如:

validateResponse = (response) => validate(response); 

parseJson = (json) => JSON.parse(json); 

fetchUnits() { 
    return this.http.get(requestUrl).map(this.validateResponse).map(this.parseJson); 
} 

這樣可觀察到的將是返回調用者可以訂閱

export class DataComponent{ 
    someMethod() { 
     return this.http.get(path).map(res => { 
     return res.json(); 
     }); 
    } 

    otherMethod() { 
     this.someMethod().subscribe(data => this.data = data); 
    } 
} 

呼叫者也可以在其他類。這裏只是爲了簡潔。

data => this.data = data 

res => return res.json() 

是箭頭功能。它們與正常功能相似。這些函數被傳遞給subscribe(...)或,以便在數據從響應到達時從observable中調用。 這就是爲什麼無法直接返回數據的原因,因爲當someMethod()完成時,數據尚未收到。

+0

您在那裏有一個錯字,第一個捲曲剎車應該在「res =>」部分之後,如下所示:'res => { return res; }' – Neyxo

+0

@Neyxo非常感謝提示! –

3

兩種方式我所知道的:

export class SomeComponent implements OnInit 
{ 
    public localVar:any; 

    ngOnInit(){ 
     this.http.get(Path).map(res => res.json()).subscribe(res => this.localVar = res); 
    } 
} 

這會將結果分配到本地變量,一旦信息被返回就像一個承諾。那麼你只需要做{{ localVar }}

另一種方法是獲得一個可觀察的localVariable。

export class SomeComponent 
{ 
    public localVar:any; 

    constructor() 
    { 
     this.localVar = this.http.get(path).map(res => res.json()); 
    } 
} 

你露出了觀察到的這種方式,此時你可以在你的HTML做的是使用AsyncPipe {{ localVar | async }}

請嘗試一下,讓我知道,如果它的工作原理。另外,由於角度2是非常新的,如果有什麼不對,請隨時發表評論。

希望它有幫助

+1

真正有趣的信息在這裏@querty_igor這種方式和主題() – BenRacicot

+0

之間有什麼區別,如果我沒有弄錯,主題是無論如何可觀察到的類型。它主要用於轉發數據,然後您的服務或組件訂閱它,但此時它是可觀察的。所以Subject() - > next() - > asObserable() - > observable.subscribe()。有一段時間沒有使用角度2。糾正我,如果我錯了。日Thnx –

0

我已經用這種方式很多時間...

@Component({ 
 
    selector: "data", 
 
    template: "<h1>{{ getData() }}</h1>" 
 
}) 
 

 
export class DataComponent{ 
 
    this.http.get(path).subscribe({ 
 
     DataComponent.setSubscribeData(res); 
 
    }) 
 
} 
 

 

 
static subscribeData:any; 
 
static setSubscribeData(data):any{ 
 
    DataComponent.subscribeData=data; 
 
    return data; 
 
}

使用static關鍵字,並節省您的時間......這裏不是你可以使用靜態變量或直接返回你想要的對象....希望它會幫助你..快樂編碼。 ..