2016-05-16 59 views
0

我有数组,其中的类指令有一个execute()函数,返回一个Observable。 execute函数将执行一个异步任务,当它完成时,它会调用myObserver.complete(),它应该触发列表中的下一条指令,以调用它的execute()函数。我不知道如何做到这一点。如何使用TypeScript和RxJs连续执行一系列指令?

我正在实施所有这些,所以我愿意接受任何建议,包括改变我设置我的教学课程的方式。主要目标是我需要按顺序在每个指令异步执行方法中运行代码。当指令完成执行时,移动到列表中的下一个,直到所有内容都被执行完毕。

目前我通过递归来做到这一点,我通过指令列表,然后索引我目前正在处理的指令。完成后,我将索引增加1并再次调用自己。虽然这有效,但必须有更好的方法,但我还没有拿出一个。思考?

回答

2

如果我深知,你可以尝试这样的:对应于你的使用情况

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

呢?这假定您的execute功能在每个项目上。 concatMap将认购executeInstruction返回的每个可观察项目,并且只有在前一个观察项目完成时才会认购下一个项目。文档here

UPDATE:打字稿方式:

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

这看起来像它会为我用的情况下工作,但我不知道如何与打字稿做到这一点。我试过:Observable.from(指令).concatMap((指令:指令)=> {0}返回instruction.execute(); });这抱怨道:“提供的参数不匹配呼叫目标的任何签名” – testing123

+0

啊,有一个fromArray。现在尝试一下。 – testing123

+0

好吧,我不能用'打字稿',但错误信息很清楚。检查您的呼叫目标的签名和您提供的物品的类型,这真的很简单...对于SO的调试问题,建议提供一个重现错误的示例代码。关于'fromArray',它在Rxjs 4中,我认为它也适用于Rxjs 5,但不要拿我的话来说。检查文档 – user3743222

相关问题