2016-05-16 2 views
0

私はArrayを持っています。ここで、class InstructionはObservableを返すexecute()関数を持っています。 execute関数は非同期タスクを実行し、終了するとmyObserver.complete()を呼び出してリスト内の次の命令をトリガしてexecute()関数を呼び出さなければなりません。私はこれを行う方法がわかりません。TypeScriptとRxJを使用して一連の命令を連続して実行する方法は?

私はこのすべてを実装していますので、私はInstructionクラスを設定する方法を変更することを含め、任意の提案に開放しています。主な目標は、各命令の非同期実行メソッドでコードを順番に実行する必要があることです。命令が実行されたら、すべてが実行されるまで、リスト内の次の命令に移動します。

現在、私は命令のリストに渡し、現在作業中の命令のインデックスを渡す再帰によってこれを行います。終了したら、インデックスを1だけインクリメントして、もう一度自分自身を呼び出します。それが機能している間に、よりよい方法が必要ですが、私はまだそれを思いついていません。思考?あなたのユースケースに対応

Rx.Observable.from(yourArray).concatMap(function executeInstruction(item){ 
    return item.execute(...) 
    }) 

ん:私はよく理解した場合

答えて

2

、あなたのような何かを試みることができますか?これはあなたのexecute機能が各項目にあることを前提としています。 concatMapは、executeInstructionによって返された観測可能な観測値のそれぞれにサブスクライブし、前の観測値が完了したときにのみ、次の観測値に対応する次の観測値にサブスクライブします。ドキュメントhere

UPDATE:活字体道:それは私のユースケースのために働くだろうが、私は活字体でこれを行う方法を確認していないように見えます

Observable.from(instructions, (instruction) => { 
    return instruction; 
}).concatMap((instruction) => { 
    return instruction.execute(); 
}); 
+0

。私は試しました:Observable.from(instructions).concatMap((instruction:Instruction)=> { return instruction.execute(); });それは文句を言う: "提供されたパラメータは、呼び出しターゲットの署名と一致しません" – testing123

+0

ああ、fromArrayがあります。今これを試してみてください。 – testing123

+0

さて、私は 'typescript'を手助けすることはできませんが、エラーメッセージはかなり明確です。あなたのコールターゲットのシグネチャとあなたが提供するアイテムのタイプを確認してください。それは本当に簡単です... SOのデバッグ質問については、エラーを再現するサンプルコードを提供することをお勧めします。 'fromArray'については、Rxjs 4にありますが、Rxjs 5にもそこにあると思いますが、私の言葉はそれを取っていません。ドキュメントを確認してください – user3743222

関連する問題