Tengo un método que lo toma como parte de la administración de formularios y hace lo siguiente. Puedo resolver un caso como este con promesas fácilmente, ¡pero este es el momento de aprender observables! Entonces, las tareas del método:
clientWebApiService.getClients() para obtener la lista de clientes y devuelve el observable de environmentWebApiService.getEnvironmentsNotInPipeline()subscribe me gustaría mapear una estructura de datos a otra para poder configurar cosas de un formulario El subscribe() arroja el siguiente error:
ERROR TypeError: You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable. at Object.subscribeToResult (subscribeToResult.js:73) at MergeMapSubscriber._innerSub (mergeMap.js:130) at MergeMapSubscriber._tryNext (mergeMap.js:127) Ya (con suerte) me di cuenta de que la suscripción espera una transmisión que no se proporciona aquí. Si veo correctamente, el segundo flatMap debería devolver un Observable que es procesado por subscribe() . En esta estructura no habrá. En este caso, ¿a qué método debería llamarse? Encontré ladocumentación de rxjs con muchos métodos. no se cual busco
He intentado reestructurar mi código, pero si no hay subscribe() , entonces no hay ejecución.
public editHandler({ dataItem }): void { let clients: IClientContract[]; let environments: IEnvironmentContract[]; this.clientWebApiService.getClients() .flatMap((clientsResult: any): Observable<IEnvironmentContract[]> => { clients = clientsResult as IClientContract[]; console.log('1', clients); return this.environmentWebApiService.getEnvironmentsNotInPipeline(); }) .flatMap((environmentResult: IEnvironmentContract[]): any => { environments = environmentResult; console.log('2', environments); }) .subscribe(() => { console.log('3'); let editableDeploymentItem: IDeployableEnvironmentForm = this.deployableEnvironmentContractMapperService .mapDeployableEnvironmentContractToDeployableEnvironmentForm( dataItem, clients, environments); console.log('4', editableDeploymentItem); this.editDeployment = editableDeploymentItem; this.isNew = false; }); }Deberías usar do . do operator simplemente realiza una acción y continúa el vapor. En su caso, no veo por qué necesita otro operador, ya que se puede hacer en el método de subscribe .
Solo puedes hacer:
public editHandler({ dataItem }): void { let clients: IClientContract[]; let environments: IEnvironmentContract[]; this.clientWebApiService.getClients() .flatMap((clientsResult: any): Observable<IEnvironmentContract[]> => { clients = clientsResult as IClientContract[]; console.log('1', clients); return this.environmentWebApiService.getEnvironmentsNotInPipeline(); }) .subscribe((environmentResult: IEnvironmentContract[]): any => { environments = environmentResult; console.log('2', environments); console.log('3'); let editableDeploymentItem: IDeployableEnvironmentForm = this.deployableEnvironmentContractMapperService .mapDeployableEnvironmentContractToDeployableEnvironmentForm( dataItem, clients, environments); console.log('4', editableDeploymentItem); this.editDeployment = editableDeploymentItem; this.isNew = false; }); }