Каков элегантный способ обработки списка асинхронных событий и продолжения после их завершения?

Я создаю приложение 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 есть довольно хорошая анкета, которая поможет вам найти оператора, которого вы ищете в различных ситуациях.

Другие вопросы по тегам