2017-08-28 46 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; 
       }); 
     }); 
}