2016-12-06 1 views
1

から、非常に複雑なサンプル通知ここここでは、内側flatMap

public runInstructionAndGetResult(): Observable<string> { 
    return this.runAnInstruction() 
     .flatMap((data) => { 
      console.info("flatMap of runAnInstruction:", data); 
      return this.getInstructionExecutionStatusInPolling() 
       .filter(data => data != "Polling") 
       .take(1) 
       .flatMap((data) => { 
        console.info("flatMap of getInstructionExecutionStatusInPolling:", data); 
        return this.getInstructionResult(); 
       }).map((data) => { 
        console.info("Map of getInstructionResult:", data); 
        return data; 
       }); 
     }); 
    } 

    public runAnInstruction(): Observable<string> { 
    return Observable.of("StartRun"); 
    } 

    public getInstructionResult(): Observable<string> { 
    return Observable.of("FinalResult"); 
    } 

    public getInstructionExecutionStatusInPolling(): Observable<string> { 
    return Observable.interval(1000) 
     .concatMap(data => { 
      return this.getInstructionExecutionStatus(); 
     }); 
    } 

    public getInstructionExecutionStatus(): Observable<string> { 
    return Observable.of("Polling", "Terminate"); 
    } 

をplunk: https://plnkr.co/edit/c1cahMtVARQnLgnHWlEe?p=preview

主な問題は、私だけでは外側の内側の流れの「進化」について通知したい。

ここで、すべての内部フラットマップが完了したときにのみ、メインに「次の」イベントがあります。

通知を受け取る方法?ポーリング時などにメインストリームに明示的な値を出力するにはどうすればよいですか?

ありがとうございました。

+0

あなたはより多くのことができますあなたが得たい結果を明示していますか?または、コンソールでどの出力を表示したいかを指定します。私はこれが何をすべきか理解していない。 – martin

+0

@martin私はちょうど例えば "StartRun"データや "Terminate"データを使ってメインのサブスクライブをしたいと思っています。 –

+0

もし私がこの正しいことを理解していれば、あなたは1つのデータムだけで始まるストリームから2つの次の呼び出しを受け取りたいと思うでしょう。その場合は、concat-operatorsを調べるか、 'this.runInstructionAndGetResult ).startWith( "StartRun")。subscribe ... ' – olsn

答えて

1

共有するソリューションが見つかりました。ここで

はplunker更新:

https://plnkr.co/edit/c1cahMtVARQnLgnHWlEe?p=preview

を基本的に私が使用して単純な観察可能なを作成します:https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/create.md

、私は次のメソッドプログラムで呼び出して、最後に完了します。

public runInstructionAndGetResult(): Observable<string> { 
    return Observable.create((ops)=> { 
     ops.next(1); 
     this.runAnInstruction() 
     .concatMap((data) => { 
      ops.next(2); 
      console.info("flatMap of runAnInstruction:", data); 
      return this.getInstructionExecutionStatusInPolling() 
       .filter(data => data != "Polling") 
       .take(1) 
       .concatMap((data) => { 
        ops.next(3); 
        console.info("flatMap of getInstructionExecutionStatusInPolling:", data); 
        return this.getInstructionResult(); 
       }).map((data) => { 
        console.info("Map of getInstructionResult:", data); 
        ops.next(4); 
        ops.complete(); 
        return data; 
       }); 
     }).subscribe(); 
     }); 
    } 
関連する問題