2016-08-09 14 views
0

達成したいことを明確にするために変更されました。Rx.Observable.subscribeは観測可能な値を返します

は私が観察可能オブザーバーからデータを収集しRxJsでコードを書くことはできますか?以下のシナリオのように:

  1. 1審査官は、複数の学生
  2. 審査官は、各学生は、審査官が質問をするたびにオブザーバー
  3. ある観察可能
  4. です答えを知っている生徒(すなわち.filter())は、答えが
  5. 審査官は、Rxjs観察可能火災が.next()と新しい値が、方法.subscribe()を持つすべてのオブザーバーは、それに反応する、で正しいもの

として最初の答えがかかりますが、私は知りませんこの観察者はObservableに値を返すことができます。

だから、ここで私は必要なものである:

  1. どのようにオブザーバーが観測に値を送り返すことができますか?
  2. 最初のオブザーバーがレースに勝利し、他のオブザーバーはそれ以降無視されますか?
  3. Observerが応答していないことを知ることは可能でしょうか?

私は自分のニーズに明確なよ今願っています:)

+0

ここから値を返すのはなぜだろうか分かりません。あなたのユースケースを詳しく説明できますか? – paulpdaniels

+0

ええ、あなたが達成しようとしていることは本当に不明です。壊れたコードではなく言葉で表現できますか? – Ptival

答えて

1

[OK]を、私は問題をより理解しています。

は、私はあなたが審査官と学生の両方が観測およびオブザーバーの性質を持っているためである必要があるものと考えています。これは、彼らが唯一の1方向通信メカニズムであるとして、あなたは、観測を使用して2ウェイ通信を取得する唯一の方法です。

  1. 解決策は、生徒の回答を観察可能にすることです。
  2. 次に、raceを使用してレースを行うことができます。
  3. うーん...あなたはそれが答えていない学生のために何を意味するのかを定義する必要があると思います:タイムアウトがあり、または彼らは、後に答えないことを宣言することができますか?
const question$ = Rx.Observable.range(1, 4) 
           // in case you want everyone to wait 
           .publish(); 

function makeStudent(name, worstTimeToAnswer) { 
    return q => 
    Rx.Observable.of(`${name} answers question ${q}`) 
       .delay(Math.random() * 1000 * worstTimeToAnswer); 
} 

// Alice answers questions in at most 5 seconds 
const alice = makeStudent("Alice", 5); 
// Bob answers questions in at most 7 seconds 
const bob = makeStudent("Bob", 7); 

// This stream contains one answer for each question, as long as someone 
// answered fast enough. 
const winningAnswer$ = 
    question$ 
    .concatMap(q => 
     // see who answers faster between Alice and Bob 
     Rx.Observable.race(alice(q), bob(q)) 
     // or drop the question if nobody answers within 4 seconds 
        .takeUntil(Rx.Observable.timer(4000)) 
    ); 

winningAnswer$.subscribe(a => console.log(a)); 
question$.connect(); // questions start flowing 

// should print something like: 

// Alice answers question 1 
// Bob answers question 3 
// Alice answers question 4 

// where Q2 was dropped because nobody answered fast enough 
// and Alice often answers faster than Bob 

あなたが実際に質問に対する回答は、次の質問を変更するフィードバックループをしたい場合、あなたはおそらくループを閉じるためにSubjectを使用する必要があります。

+0

こんにちは@Ptival、それがRxJsについてもっと学ぶのを助けたので、明確化のためにあなたに感謝します。しかし私は、この2ウェイ・ソリューションが、私がやっていたことに対してあまりにも危険で、単にObservableをまったく使用しない別の簡単なアプローチを選択したことを発見しました。 –

0

Events-exライブラリは、観察者が観察に値を返送することをサポートしています。

eventable = require('events-ex/eventable') 

class Examiner 
    # advanced usage see API topic. 
    eventable MyClass 
    makeQuestion: -> 
    aQuestion = '....' 
    theAnswer = this.emit 'ask', aQuestion 

class Student 
    constructor: (aExaminer)-> 
    aExaminer.on 'ask', this.answer if aExaminer 
    answer: (aQuestion)-> 
    # this is the event object, not the student instance. 
    this.result = 'myAnswer' 
    this.stopped = true # stop other listeners. defaults to false. 
    return 
関連する問題