2017-08-28 47 views
1

我想知道我可以做這樣的事情在的await /異步和RxJS打字稿:如何鏈觀測和可無極(異步/等待,RxJS,可觀察)

async function bar(): Promise<boolean>{ ... } 

function boo(): Observable<any> { ... } 

function baz(): Observable<any> { 
    return Observable 
     .fromPromise(() => bar()) 
     .map(() => boo()) 
} 

要總結,我有多個baz流,我將在以後鏈接zip。在每個baz()中,我需要做一些異步檢查。 但沒有附加內容... Observable.fromPromise按預期工作。噓不。這就像當我訂閱流(zip(baz1(),baz2())),boo永遠不會執行。

我錯過了什麼?這個故事中的最佳做法是什麼?

編輯:

這裏是代碼的第一部分:

syncResource(urlEndpoint: string, storeCollectionKey: string): Observable<any> { 
    return Observable 
     .fromPromise(this.shouldSyncResource(urlEndpoint, storeCollectionKey)) 
     .map((shouldUpdateResource) => { 
      if(!shouldUpdateResource){ return Observable.empty(); } 
      // here i can get "shouldUpdateResource" value 

      return this._Remote.get(urlEndpoint, this._getRequestOptions()) 
       .map((response: Response) => response.json()) 
       .map((collection) => { 
        collection.forEach((item) => { 
         this._Stores[storeCollectionKey].update(item); 
        }); 
       }); 
     }); 
} 

這裏是第二部分:

Observable.zip(
    syncResource('/poultries', 'poultriesStoreKey'), 
    syncResource('/buildings', 'buildingsStoreKey') 
).subscribe(() => console.log('Syncing done')) 
+0

你需要傳遞的承諾'fromPromise',而不是返回一個無極的功能,請參見http:// reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-fromPromise – martin

+0

Thx Martin,但即使當我「強制」.fromPromise(new Promise((resolve,reject)=> resolve( true))) 它不起作用,我可以在任何情況下獲得承諾的價值回報 – David

+0

您是否訂閱從'baz()'返回的Observable? – martin

回答

0

確定它已解決。我需要使用mergeMap在代碼的第二部分返回一個值

syncResource(urlEndpoint: string, storeCollectionKey: string): Observable<any> { 
    return Observable 
     .fromPromise(this.shouldSyncResource(urlEndpoint, storeCollectionKey)) 
     .mergeMap((shouldUpdateResource, index) => { 
      if(!shouldUpdateResource){ return Observable.empty(); } 

      return this._Remote.get(urlEndpoint, this._getRequestOptions()) 
       .do((response: Response) => this.rememberResponseHashIfPresent(response.headers.get('x-hash'), storeCollectionKey)) 
       .map((response: Response) => { 
        console.log(response.json()); 
        return response.json(); 
       }) 
       .map((collection) => { 
        collection.forEach((item) => this._Stores[storeCollectionKey].update(item)); 
        return true; 
       }); 
     }); 
}