2016-07-10 51 views
28

我不知道如何從Observable中提取值以便由Observable存在的函數返回。我只需要從它那裏得到一個值就可以返回,沒有別的。如何從裏面有Observable訂閱的函數返回值?

其中工程

function getValueFromObservable() { 
    this.store.subscribe(
     (data:any) => { 
      console.log(data) 
     } 
    ) 
} 
getValueFromObservable() 

我需要這個工作,函數返回值,然後將當前版本:

function getValueFromObservable() { 
    this.store.subscribe(
     (data:any) => { 
      return data 
     } 
    ) 
} 
console.log(getValueFromObservable()) 

我在做什麼錯在這裏?

+1

您應該返回一個可觀測/當你的觀測值得到解決時,通過它承諾並傳遞數據 – galvan

+1

你能爲此提供一些簡單的代碼嗎? – Teddy

+4

你試圖實現的是一種反模式:你試圖「同步」一個異步任務。這不是觀察者應該工作的方式。總之,在大多數情況下,具有可觀察輸入的函數也應該返回可觀察值 - 或者什麼也不返回。當你需要對輸出做些什麼時,訂閱它。在這種情況下,如果你想要console.log數據,只需在'subscribe'內執行即可。 –

回答

7

這是不使用Observable

在組件的完全正確的想法,你必須聲明的類成員將舉行一個對象(你會在你的組件使用)

export class MyComponent { 
    name: string = ""; 
} 

然後一個Service將回到你的Observable

getValueFromObservable():Observable<string> { 
    return this.store.map(res => res.json()); 
} 

Component SH烏爾德做好準備,以便能夠從中檢索值:

OnInit(){ 
    this.yourServiceName.getValueFromObservable() 
    .subscribe(res => this.name = res.name) 
} 

你必須從一個Observable的值賦給一個變量:

而且你的模板將消耗變量name

<div> {{ name }} </div> 

使用Observable的另一種方式是通過asynchttp://briantroncone.com/?p=623

注意:如果這是你的要求不算什麼,請更多的細節

+0

好吧,不完全。問題是數據是在observable內部捕獲的,我可以通過控制檯記錄它。我想通過調用它所在的函數來返回該值和console.log或其他文件。 – Teddy

+0

Andrei指出如何通過將name分配給組件的'name'變量來使'name'在回調之外可用。在你的情況下不可能同時返回'name'。 – Matt

+0

@Matt:我不能在'Oninit'中使用它,如果我需要顯式返回,我的調用代碼如下所示:this.actions $ .ofType(SearchActions.SEARCH_MULTIPLE_NEW_QUERY).map(toPayload).fnWithMultipleAsyncReturns ()' – ishandutta2007

7

我意識到,這個問題是相當長的一段前更新你的問題,你現在肯定有一個妥善的解決辦法,但爲尋找這個我會建議用Promise解決它以保持異步模式。 一個更詳細的版本將創建一個新的承諾:

getValueFromObservable() 
    .then((data:any)=>{ 
    //... continue with anything depending on "data" after the Promise has resolved 
}) 

一個苗條的解決方案:

function getValueFromObservable() { 
    return new Promise(resolve=>{ 
     this.store 
     .take(1) //useful if you need the data once and don't want to manually cancel the subscription again 
     .subscribe(
      (data:any) => { 
       console.log(data; 
       resolve(data); 
     }) 
    } 
} 

在接收端,你會再有「等待」諾言像這樣的東西來解決將是使用RxJS」 .toPromise()代替:

function getValueFromObservable() { 
    return this.store 
     .take(1) 
     .toPromise() 
} 

接收側保持與上述相同的過程。希望有所幫助!

2

可以從任何位置檢索可觀察值。源序列是第一個推送到一個特殊的觀察者,它能夠發射到別處。這是通過來自反應性擴展(RxJS)的主題類實現的。

var subject = new Rx.AsyncSubject(); // store-last-value method 

儲值到觀察者

subject.next(value); // store value 
subject.complete(); // publish only when sequence is completed 

從其他地方獲取價值,訂閱觀察者,像這樣:

subject.subscribe({ 
    next: (response) => { 
     //do stuff. The property name "response" references the value 
    } 
}); 

主題都是觀測量和觀察員。對於其他使用場景,還有其他Subject types,如BehaviourSubject和ReplaySubject。

不要忘記導入RxJS。

var Rx = require('rxjs'); 
5

如果你想預先訂購相同的可觀察其將被退回,只是使用

。做():

function getValueFromObservable() { 
    return this.store.do(
     (data:any) => { 
      console.log("Line 1: " +data); 
     } 
    ); 
} 

getValueFromObservable().subscribe(
     (data:any) => { 
      console.log("Line 2: " +data) 
     } 
    ); 
+0

很好的回答....它解決了我的問題在這樣一個簡單的方法..... +1 – Romesh

+0

你也可以使用其他操作符,如'.map(data => data)',它執行相同的操作,然後在預期的結果 –