Каков элегантный способ обработки списка асинхронных событий и продолжения после их завершения?
Я создаю приложение Angular. В конструкторе моего компонента я инициирую запрос к нескольким элементам с сервера, что, естественно, происходит асинхронно. Эти запросы возвращаются мне как rxjs/Behavior
объекты, на которые я подписан.
Что мне нужно сделать, так это продолжить обработку, как только последний вернется. Но мне нужно убедиться, что они обрабатываются в том порядке, в котором они были отправлены, а не обязательно в том порядке, в котором они были возвращены.
Я мог бы создать хитрый взлом, чтобы обнаружить, когда последний вернулся:
let counter = 0;
let output = new Array( input.length );
for ( let i = 0 ; i < input.length ; i++ ) {
counter++;
fetch( input[i] ).subscribe(
result => {
output[i] = result;
counter--;
if ( counter === 0 ) {
// what to do at the end
}
}
);
}
И это работает. Но это уродливо, это нелегко понять, и не то, что я бы назвал готовым к использованию кодом.
Каков угловой способ сделать что-то, когда все предметы были выполнены?
1 ответ
Ты ищешь forkJoin
:
Observable.forkJoin(...input.map(fetch))
.subscribe(responses => {
// responses contains the emitted values after completion
// in the same order as input
});
См. Документы для более подробной информации и некоторых вещей, которые нужно остерегаться.
В качестве расширенного совета на будущее на веб-сайте rxjs есть довольно хорошая анкета, которая поможет вам найти оператора, которого вы ищете в различных ситуациях.