принять меры, если все наблюдаемые в цикле разрешены в Ionic 4 Angular 6 - PullRequest
0 голосов
/ 01 марта 2019

У меня есть функция с именем getDevices(), которая выбирает массив устройств, выполняет итерацию по каждому устройству и вызывает метод updateToServer(), который обновляет эти устройства на сервере.Мне нужно запустить другой метод после того, как все updateToServer наблюдаемые в цикле разрешены, как я могу достичь этого?

this.deviceService.getDevices().then((res : devicesInterface) => {
      if(res){        

        this.devices = res.devices;   

        this.devices.forEach(device => {  

          let data : ResUpdateDevices = {
            device: device,
            token: this.authenticationService.getToken(),
          };

          this.deviceService.updateDevicesToServer(data).subscribe(res => {
            console.log(res)  
          },err=>{
            console.log(err)
          });
        });

      } 
    })

Я читал на форуме о методе Promise.all(), но не нашел ни одного рабочего примера по этому поводу.

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Чтобы сделать то, что вы пытаетесь достичь, Observables были бы очень полезны.Нечто подобное должно работать (не проверял):

    // make getDevices() to return an observable, or if you can't use 'from' to create a new Observable from a promise
    this.deviceService.getDevices()
        .pipe(
          flatMap(d => d), // each items from array emitted one by one
          map(device => {  
            let data : ResUpdateDevices = {
              device: device,
              token: this.authenticationService.getToken(),
            };
            return this.deviceService.updateDevicesToServer(data);
          }),
          tap(res => /*do something else without updating value emitted by Observable*/)
        ).subscribe(res => {
          // do something
          console.log(res);
        }, err=>{
          console.log(err)
        });
0 голосов
/ 01 марта 2019

Использование forkJoin

Зачем использовать forkJoin?

Этот оператор лучше всего использовать, когда у вас есть группа наблюдаемых и вы заботитесь только о финалеизлучаемое значение каждого.Один из распространенных вариантов использования этого - это если вы хотите отправить несколько запросов при загрузке страницы (или по какому-либо другому событию) и хотите действовать только тогда, когда ответ получен для всех.Таким образом, это похоже на то, как вы можете использовать Promise.all.

. Имейте в виду, что если какая-либо из внутренних наблюдаемых, предоставленных в forkJoin, вы потеряете значение любых других наблюдаемых, которые будут или уже были завершены, есливы не улавливаете ошибку правильно на внутренней наблюдаемой.Если вас интересует только то, что все внутренние наблюдаемые завершаются успешно, вы можете обнаружить ошибку снаружи.

Stackblitz

Ваш код

import { forkJoin } from 'rxjs';
import { tap } from 'rxjs/operators';

this.deviceService.getDevices().then((res : devicesInterface) => {
  if(res){        

    this.devices = res.devices;
    // use map instead of foreach to return a result
    var allObservables = this.devices.map(device => {  

        let data : ResUpdateDevices = {
            device: device,
            token: this.authenticationService.getToken(),
        };

        // return Observable
        return this.deviceService.updateDevicesToServer(data).pipe(tap(res => {
              console.log(res);  
          },err=>{
              console.log(err);
          }));
    });

    // call forkJoin on returned observables
    forkJoin(allObservables).subscribe(() => /* do something here */);
  } 
})
...