Pregunta Angular2 Observable: ¿cómo esperar a que finalicen todas las llamadas a funciones en un ciclo para finalizar?


Intento mejorar mi conocimiento de Angular2 migrando una aplicación actualmente escrita en Angular1

Una característica en particular me tiene perplejo. Estoy tratando de replicar una función donde una función de llamada espera para continuar hasta que la función a la que llama haya completado un ciclo de promesas. En angular, la función que estoy llamando se ve básicamente así:

this.processStuff = function( inputarray, parentnodeid ) {
    var promises = [];
    var _self = this;
    angular.forEach( inputarray , function( nodeid ) {

        switch ( parentnodeid )
        {
            case ‘AAA’ : var component = _self.doMoreStuff( nodeid, parentnodeid ); break;
            case ‘BBB’ : var component = _self.doMoreStuff( nodeid, parentnodeid ); break;
            case ‘CCC’ : var component = _self.doMoreStuff( nodeid, parentnodeid ); break;
            default    : var component = null;
        }
        promises.push( component );
    });
    return $q.all(promises);
}; 

Contiene un bucle forEach que llama a otra función (doMoreStuff) que también devuelve una promesa y almacena todas las promesas devueltas en una matriz.

Con Angular1, cuando llamo a processStuff en otra función, podría contar con que el sistema espera hasta que processStuff se complete antes de ingresar al código en el bloque then. ES DECIR:

service.processStuff( arraying, parentidarg )
       .then(function( data ) {
              ... 

La persona que llama de processStuff espera por todos doMoreStuff invocaciones para completar hasta que la persona que llama de processStuff entra en su bloque luego.

No estoy seguro de cómo lograr esto con Angular2 y Observables. Puedo ver en estas publicaciones que, para imitar las promesas, básicamente, Observables solo usa suscribirse en lugar de:

Angular 1.x $ q para Angular 2.0 beta

Pero, ¿cómo espero todas las invocaciones en el forEach ciclo para completar antes de que mi sistema pueda continuar


26
2018-02-23 01:05


origen


Respuestas:


He estado haciendo esto con forkJoin

import {Observable} from 'rxjs/Observable';
import 'rxjs/add/observable/forkJoin';

Observable.forkJoin(
  this.http.get('./friends.json').map((res: Response) => res.json()),
  this.http.get('./customer.json').map((res: Response) => res.json())
)
.subscribe(res => this.combined = {friends: res[0].friends, customer: res[1]});

Más información aquí: http://www.syntaxsuccess.com/viewarticle/angular-2.0-and-http


58
2018-02-23 01:07