web-dev-qa-db-ja.com

RxJSとの連鎖の約束

私は一般的にRxJSとFRPに不慣れです。 ExpressJSアプリケーションの既存のpromiseチェーンを、実際に観察できるように変換することを考えました。これはおそらく最良の例ではないことは承知していますが、誰かが光を当てるのを手伝ってくれるかもしれません。

私がやろうとしていること

  1. 私には2つの約束があります-prom1とprom2
  2. Prom2の前にprom1を実行したい
  3. Prom1がreject(err)を送信した場合、開始する前にprom2をキャンセルしたいと思います。
  4. Prom1が返すエラーメッセージをオブザーバーのonErrorメソッドで使用できるようにしたい。

var prom1 = new Promise(function(resolve, reject) {
    if (true) {
       reject('reason');
    }
    resolve(true);
});

var prom2 = new Promise(function(resolve, reject) {
    resolve(true);
});

// What do I do here? This is what I've tried so far...
var source1 = Rx.Observable.fromPromise(prom1);
var source2 = source1.flatMap(Rx.Observable.fromPromise(prom2));

var subscription = source2.subscribe(
    function (result) { console.log('Next: ' + result); },

    // I want my error 'reason' to be made available here
    function (err) { console.log('Error: ' + err); },

    function () { console.log('Completed'); });
13
Pathsofdesign

あなたがやろうとしていることを私が理解した場合、promiseを返し、それらを連結する関数から2つの据え置きオブザーバブルを作成する必要があります。

var shouldFail = false;

function action1() {
    return new Promise(function (resolve, reject) {    
        console.log('start action1');
        if (shouldFail) {
            reject('reason');
        }
        resolve(true);
    });
}

function action2() {
    return new Promise(function (resolve, reject) {    
        console.log('start action2');
        resolve(true);
    });
}

var source1 = Rx.Observable.defer(action1);
var source2 = Rx.Observable.defer(action2);

var combination = Rx.Observable.concat(source1, source2);

var logObserver = Rx.Observer.create(

function (result) {
    console.log('Next: ' + result);
},

function (err) {
    console.log('Error: ' + err);
},

function () {
    console.log('Completed');
});

その後、通常の場合:

combination.subscribe(logObserver);
// start action1
// Next: true
// start action2
// Next: true
// Completed

そして、最初の約束が失敗した場合:

shouldFail = true;
combination.subscribe(logObserver);
// start action1
// Error: reason

http://jsfiddle.net/cL37tgva/

19
Bogdan Savluk

flatMapは、ObservableのObservableをObservableに変換します。多くの場合、オブザーバブルがあり、マップ関数でオブザーバブルがエミットする各「アイテム」のプロミスを作成する必要があるため、Promisesの多くの例で使用されています。 fromPromiseの呼び出しはすべて、新しいObservableを作成するため、「observableofobservable」になります。 flatMapは、それを「フラットな」観測量に減らします。

あなたの例では、何か違うことをし、単一のプロミスをオブザーバブルに変えて、それを別のオブザーバブルとチェーンしたいとします(これも単一のプロミスから作成されます)。 Concatはあなたが探していることを行い、2つのオブザーバブルをつなぎ合わせます。

エラーケースは期待どおりに機能します。

5
Daniel Bachler