2016-06-12 9 views
28

に私がRxJSを学んだし、角度2.のは、私は次のようになり、以前の1の結果に依存して複数の非同期関数呼び出しとの約束のチェーンがあるとしましょう:やっで連鎖観測はRxJS

var promiseChain = new Promise((resolve, reject) => { 
    setTimeout(() => { 
    resolve(1); 
    }, 1000); 
}).then((result) => { 
    console.log(result); 

    return new Promise((resolve, reject) => { 
    setTimeout(() => { 
     resolve(result + 2); 
    }, 1000); 
    }); 
}).then((result) => { 
    console.log(result); 

    return new Promise((resolve, reject) => { 
     setTimeout(() => { 
     resolve(result + 3); 
     }, 1000); 
    }); 
}); 

promiseChain.then((finalResult) => { 
    console.log(finalResult); 
}); 

私の試みを約束を使用せずにRxJSを単独で使用しても、次のようになりました。

var observableChain = Observable.create((observer) => { 
    setTimeout(() => { 
    observer.next(1); 
    observer.complete(); 
    }, 1000); 
}).flatMap((result) => { 
    console.log(result); 

    return Observable.create((observer) => { 
    setTimeout(() => { 
     observer.next(result + 2); 
     observer.complete() 
    }, 1000); 
    }); 
}).flatMap((result) => { 
    console.log(result); 

    return Observable.create((observer) => { 
    setTimeout(() => { 
     observer.next(result + 3); 
     observer.complete() 
    }, 1000); 
    }); 
}); 

observableChain.subscribe((finalResult) => { 
    console.log(finalResult); 
}); 

プロミスチェーンと同じ出力が得られます。私の質問は

  1. 私はこの権利をしていますか?上記のコードにできるRxJS関連の改善はありますか

  2. この観測可能なチェーンを繰り返し実行するにはどうすればよいですか?すなわち端部で別のサブスクリプションを追加するだけで、私はそれが1、3および6

    observableChain.subscribe((finalResult)=> {; はconsole.log(finalResultを)})を印刷することを期待もさらに6を生成します。

    observableChain.subscribe((finalResult)=> { にconsole.log(finalResult); })。 Rxjs対約束組成について

答えて

21

、これは頻繁にあなたが以前そのうち、SOの質問の数を参照することができ、質問をしているよう:

flatMapは、Promise.thenと等価です。

2番目の質問では、既に放出された値を再生したいのですか、または新しい値が到着したときに処理しますか?最初のケースでは、publishReplayオペレータを確認してください。 2番目のケースでは、標準購読で十分です。しかし、寒さに気づく必要があるかもしれません。あなたの情報源に応じて熱い二分法と対比される(概念の図示の説明についてはHot and Cold observables : are there 'hot' and 'cold' operators?を参照)

関連する問題