У меня есть массив файлов, которые я хотел бы загрузить (или, по крайней мере, , попробуйте , чтобы загрузить, отдельный сбой в порядке) в Angular 5, по одному, а затем узнать, когда все подписки имеют завершено.
В старые времена Javascript я делал бы это, используя цепные обратные вызовы, но, поскольку сейчас у нас есть замечательные инструменты, такие как rxjs
, я чувствую, что есть лучший, более «реактивный» способ сделать это.
Итак: Каков наилучший способ сделать это с rxJS?
У меня есть провайдер Angular, который загружает один файл и возвращает Observable; Я хотел бы попробовать загрузить каждый файл в массиве по отдельности и знать, когда они все завершены.
В моем примере ниже я заменил провайдера простым субъектом, который завершается со случайным успехом или ошибкой через случайное количество времени, пытаясь эмулировать шаткое подключение к Интернету.
Проблема: Когда я использую Observable.combineLatest (), я получаю окончательный результат только тогда, когда ВСЕ наблюдаемые имеют следующий () результат: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
. Если не все Наблюдаемые завершены, я никогда не получу результат вообще.
Кроме того, Наблюдаемые запускаются не по одному, а скорее сразу. При использовании с запросом AJAX это может привести к перегрузке соединения с ячейкой.
Есть мысли о том, как к этому подойти?
constructor() {
let observables = [];
for (var i = 0; i < 100; i++) {
observables.push(this.testObservable(i));
}
Observable.combineLatest(observables)
.subscribe(res => {
console.log('success', res);
}, err => {
console.log('errors', err);
})
}
testObservable(param) {
let subject = new Subject;
let num = Math.random() * 10000;
console.log('starting', param)
setTimeout(() => {
if (Math.random() > 0.5) {
console.log('success', param);
subject.next(param);
} else {
console.log('error', param);
subject.error(param);
}
subject.complete();
}, num);
return subject;
}