2017-03-02 69 views
1

我正在學習使用Angular 2和Typescript在離子2中進行開發。你可以返回一個observable作爲Angular 2(使用Typescript)的承諾嗎?

我立即試圖創建一個函數,該函數返回一個在觀察變量發生變化時得到解決的承諾。

對於我來說,在頁面組件嘗試使用它之前檢測提供程序中的初始化是否已完成時,這將會非常有用。例如

api.isInitialized() 
    .then(() => { 
     //api provider is initialized. Now safe to call it! 
     return api.fetch("NEWS"); 
    }); 
    .then((newsData) => { 
     //do something with newsData 
    }); 

我有以下的進口:

import 'rxjs/add/operator/map'; 
import 'rxjs/add/operator/toPromise'; 
import { Observable} from 'rxjs/Observable'; 

只是爲了檢查我的toPromise將如何工作,我試着給下面的功能的認識。我只得到「testObservable已經改變」。 我也希望能得到「承諾解決」。

我將如何對testObservable進行更改以生成已解決的承諾?

observerTest(){ 
    let testObservable: any; 
    let testObserver: any; 

    testObservable = Observable.create(observer => { 
     testObserver = observer; 
    }); 

    let myPromise = testObservable.toPromise(); 

    testObservable.subscribe(data => { 
     console.log("testObservable has changed."); 
     console.log(data); 
    }); 

    myPromise.then(() =>{ 
     console.log("promise resolved."); 
    }); 

    testObserver.next(true); 
} 
+1

是不是因爲你有解決您的觀察爲可觀察到的與'.subscribe'或用'toPromise(承諾之間選擇),然後。 ' 如果你這樣做了,只有一個人一旦解決就會被調用。 – deKajoo

+0

我發現用testObserver.complete()替換最後一行;給我我想要的行爲。正如Brandon在回答問題(http://stackoverflow.com/questions/38557214/rxjs-topromise-behavior-different-than-observable)時提到的那樣「當RxJs將Observable轉換爲Promise時,它會創建一個Promise,從可觀察到的最後一個值。因此,承諾不會解決,直到潛在的observable完成。「 –

回答

3

這是如何將Observable作爲承諾返回。假設api.fetch("NEWS")返回一個Observable。

test(){ 
    return new Promise(resolve => { 
     api.fetch("NEWS") 
     .subscribe(data => { 
      resolve(data); 
     },(err) => { 
      resolve(err); 
     }); 
    }); 
} 

而在調用側,你會處理它的承諾:

provider.test().then(data => { 
    console.log("Data : ",data); 
}).catch(err => { 
    console.log("Error : ",err); 
}); 

雖然,我不知道,你爲什麼要返回一個可觀察的承諾?

1用例可能是 - 已經有很多調用方法被寫入來接收提供者的承諾。現在,供應商代碼突然返回一個Observable而不是Promise。

否則,通過調用方法通過.subscribe()和Promise通過.then()處理Observable更簡單。

7

官方Angular tutorial包含的例子,特別是在HTTP chapter。例如:

getHeroes(): Promise<Hero[]> { 
    return this.http.get(this.heroesUrl) 
      .toPromise() 
      .then(response => response.json().data as Hero[]) 
      .catch(this.handleError); 
} 

delete(id: number): Promise<void> { 
    const url = `${this.heroesUrl}/${id}`; 
    return this.http.delete(url, {headers: this.headers}) 
    .toPromise() 
    .then(() => null) 
    .catch(this.handleError); 
} 
相關問題