2017-06-12 86 views
-1

我試圖降低我行計數的應用程序,但我不能讓我的觀測工作...RxJs堆棧觀測

所以,我有以下情形:

let openDialog = function(): Observable<any> { 
    // some logic that defines x 
    let x = 0; 

    // return 
    return Observable.create(observable => { 

     this.handleDialogResult(x).subscribe(
      () => { 
       observable.next(); 
       observable.complete(); 
      }, 
      e => { 
       observable.error(e); 
       observable.complete(); 
      } 
     ) 
    }); 
} 


let handleDialogResult = function (x): Observable<any> { 
    switch (x) { 
     case 1: 
      return this.doMagic('Magic1'); 
     case 2: 
      return this.doMagic('Magic2'); 
    } 
} 


let doMagic = function (x): Observable<any> { 
    // some magic 
} 

那麼我想我得到了相同的功能,當你做到以下幾點:

let openDialog = function(): Observable<any> { 
    // some logic that defines x 
    let x = 0; 

    // return 
    return Observable.create(observable => { 
     this.handleDialogResult.flatMap(observable) 
    }); 
} 


let handleDialogResult = function (x): Observable<any> { 
    switch (x) { 
     case 1: 
      return this.doMagic('Magic1'); 
     case 2: 
      return this.doMagic('Magic2'); 
    } 
} 


let doMagic = function (x): Observable<any> { 
    // some magic 
} 

但這不是的情況下,可觀察的openDialog,從來沒有得到的成品/完成。任何想法我可能做錯了什麼?

+0

爲什麼你需要'flatMap'流。它看起來不像流的流 – atomrc

回答

1

哼,這行看起來可疑:

return Observable.create(observable => { 
    this.handleDialogResult.flatMap(observable) 
}); 

你爲什麼要創建一個新的觀察到的,而你已經有一個:通過handleDialogResult返回一個?

我不確定我完全理解你的代碼應該做什麼,但是爲了讓你的流在第一個值發出時結束(這是你最初的代碼似乎在做的),你只需要take一個值

您的代碼應該是這樣的

return this.handleDialogResult(x).take(1) 

如果流是包含另一個流(如您的flatMap建議)流,那麼你還需要使用switch操作

0扁平化流