[OK]を、私は問題をより理解しています。
は、私はあなたが審査官と学生の両方が観測およびオブザーバーの性質を持っているためである必要があるものと考えています。これは、彼らが唯一の1方向通信メカニズムであるとして、あなたは、観測を使用して2ウェイ通信を取得する唯一の方法です。
- 解決策は、生徒の回答を観察可能にすることです。
- 次に、
race
を使用してレースを行うことができます。
- うーん...あなたはそれが答えていない学生のために何を意味するのかを定義する必要があると思います:タイムアウトがあり、または彼らは、後に答えないことを宣言することができますか?
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
を使用する必要があります。
ここから値を返すのはなぜだろうか分かりません。あなたのユースケースを詳しく説明できますか? – paulpdaniels
ええ、あなたが達成しようとしていることは本当に不明です。壊れたコードではなく言葉で表現できますか? – Ptival