2016-06-15 5 views
1

私は以下のフィドル(私が持っているいくつかのコードの簡略版)を持っています。エラーのために1つのフラットマップの後にRxJsサブスクリプションがなくなります

https://jsfiddle.net/9uau0ya4/

const subject = new Rx.Subject(); 

const subscription = subject.flatMap(Rx.Observable.fromPromise).subscribe((value) => { 
    console.log(value); 
}); 

const promise1 = new Promise((resolve) => { 
    resolve(1); 
}); 

const promise2 = new Promise((resolve) => { 
    resolve(2); 
}); 

const promise3 = new Promise((resolve) => { 
    resolve(3); 
}); 
subject.onNext(promise1); 
subject.onNext(promise2); 
subject.onNext(promise3); 

私はフィドルを実行すると、私は1、2、3は、コンソールに記録されることを期待します。何が起こるかは、1は正常に記録されますが、被験者の次の2つのonNext()呼び出しでエラーが表示されます 未知(未定)TypeError:self._s.scheduleは関数ではありません

私は上記ネイティブの約束事とq.js約束はどちらも同じように見える。私はドキュメントを見てきましたが、私はここで何が起こっているのかの答えを考え出すことはできません。

+0

また、私はその場でブレークポイントを置く場合はどこスケジューラ(_s)(スケジューラことになっている)_sプロパティに設定されていることを表示されるプロパティ(rx.allのライン2435)ストリーム上にプルーフされた約束ごとに増分する整数値。 (約束どおりに解決する価値はありませんが、それはストリームのすべての約束と共に増えていく) – theMothaShip

答えて

3

これは、関数バインディングの問題である可能性があります。これをチェックするとjsfiddle、正常に動作します。 2つの違いは、最後にthisRx.Observableにバインドされていることです。

私はあなたの場合はプロパティを持つオブジェクトを適切基本的にこれを説明する記事を見つけることができないよう、obj.a.b(x)とbが評価され、bためthisobj.aにバインドされている関数です。しかし、関数を呼び出さずにobj.a.bを実行すると、評価は関数式を返します。その関数のthisが何であるかはわかりません。

const subject = new Rx.Subject(); 
const fromPromise = function (x) { 
return Rx.Observable.fromPromise(x); 
} 

    const subscription = subject.flatMap(fromPromise).subscribe((value) => { 
    console.log(value); 
    }); 

    const promise1 = new Promise((resolve) => { 
    resolve(1); 
    }); 

    const promise2 = new Promise((resolve) => { 
    resolve(2); 
    }); 

    const promise3 = new Promise((resolve) => { 
    resolve(3); 
    }); 
    subject.onNext(promise1); 
    subject.onNext(promise2); 
    subject.onNext(promise3); 
+0

それはうまくいった。私はそれが文脈の問題かもしれないと思ったが、スケジューラが最初にそこにあったという事実は、私に困惑していた。 – theMothaShip

+0

ありがとう、説明が助けになった。 –

関連する問題