Привет, интересно, следующий ли код выполняется последовательно? то есть всегда ли ведется запись в журнал " Рабочий завершил задачу C " после записи в журнал " Выполнено 3 задачи "?
Длинный вопрос: с оператором scan
я могу быть уверен, что задачи выполняются последовательно, что меня не беспокоит. Что меня беспокоит, так это то, что я хочу, чтобы последняя подписка делала что-то только после того, как задача С была выполнена, и я не уверен, гарантирует ли это положение, в котором находится 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")
});