2017-01-30 5 views
1

内側からObservable outerを作成する方法入れ子ObservablesでObservableエラーまたは成功を観察できますか?内部からObservable outerを作成する方法Observableの入れ子になっているObservableエラーまたは成功を確認するには?

なぜonNextonCompletedは内部では定義されていませんObservable

public updateDocument(item: Document): Observable<any> { 
    this.firstUseOfflineContainer(); 
    let afiEdit = this.offlineData.afi.edit; 

    //outer observable 
    return Observable.create(observer => { 
     //inner observable 
     this.dataService.updateRequest(item).subscribe(
      (next) => { 
       console.log("ok"); 
      }, 
      (err) => {     
       afiEdit.headers.push(item); 
       //how to throw error to outer observable 
      }, 
      () => { 
       observer.onNext(item); 
       observer.onCompleted(); 
      } 
     ); 

     return() => console.log('cleanup message') 
    }); 
} 

答えて

0

私の理解は、内側の観測が失敗したときに外側の観測可能な部分にエラーを投げることだけです。

ように、コードは次のようになります。

//Define the inner observable (probably an http call in your case) 
//I mocked your call failing or passing with a random 50/50 chance 
var innerObservable = new Rx.Observable(observer => { 
    var didMockCallFail = Math.random() < .5; 
    if(didMockCallFail){ 
    console.log('Inner observable call failed'); 
    observer.error(new Error('Call failed!')); 
    } else { 
    console.log('Inner observable call returned data'); 
    observer.next({lolData: 'I am data'}); 
    } 
}) 

//define the outer observable which just calls the inner observable 
var outerObservable = new Rx.Observable(observer => { 
    innerObservable.subscribe(
    data => observer.next(data), 
    err => observer.error(err) 
) 
}); 

outerObservable.subscribe(
    next => console.log('Got data!'), 
    err => console.error('lol fail') 
); 

さらに、あなたが観測に変数を渡すと、そのコードが再利用可能な/グローバルスコープを避けるようにしたい場合、あなたはジェネレータ関数を使用できることに注意してください、例えば

function makeObs(someParam){ 
    return new Rx.Observable(observer => { 
    observer.next(someParam); 
    }) 
} 

質問がありましたら教えてください。

+0

最後にサブスクライブするときに 'innerObservable'ではなく' outerObservable'を購読するべきですか? –

関連する問題