2017-01-30 4 views
1

Как сделать внешний Наблюдаемый осведомленным из внутреннего Наблюдаемая ошибка или успех во вложенных наблюдаемых?Как сделать внешний Observable осведомленным из внутреннего Наблюдаемая ошибка или успех во вложенных Observables?

Почему onNext и onCompleted не определено внутри внутренний 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

Не следует ли подписываться на 'externalObservable' вместо' innerObservable' в последней подписке? –