【发布时间】:2018-06-28 08:41:11
【问题描述】:
您好,请问以下代码是否按顺序执行?即日志“Worker has finished task C”是否总是在日志“Finished 3 task(s)”之后发生?
长问题:使用scan 运算符,我可以确定任务是按顺序执行的,我并不担心。让我担心的是,我希望从上次订阅中仅在任务 C 完成后才做某事,我不确定 o.complete() 的位置是否能保证这一点。例如将start() 运行do.("A") -> do.("B") -> do.("C") 而不等待扫描完成并立即运行o.complete(),给出输出:
Worker has finished task C
Doing task A
Finished 1 task(s)
Doing task B
Finished 2 task(s)
Doing task C
Finished 3 task(s)
如果是这样,你如何修复代码以实现我所描述的?
https://stackblitz.com/edit/typescript-xhhwme
class Worker {
private tasks: Subject<string>;
public init(): Observable<number> {
this.tasks = new Subject<string>();
return this.tasks.scan((count, task) => {
console.log("Doing task " + task);
return ++count;
}, 0).asObservable();
}
public do(task: string): void {
this.tasks.next(task);
}
}
function start(worker: Worker): Observable<void> {
return Observable.create(o => {
const monitor = worker.init();
monitor.subscribe(c => console.log("Finished " + c + " task(s)"));
worker.do("A");
worker.do("B");
worker.do("C");
o.complete();
worker.do("D");
});
}
const worker = new Worker();
start(worker).subscribe({
complete: () => console.log("Worker has finished task C")
});
【问题讨论】:
标签: typescript rxjs