page navigationend cambiar angular2 angular promise rxjs observable

navigationend - Angular2 observable y prometedor



title angular 6 (3)

Empecé a usar Angular2 Observable , pero no puedo encontrar algo similar a .then que usé con Promises .

Esto es lo que quiero lograr.

código de header.component.ts

public login() { this._user = AuthService.getInstance().login(this._loginInfo); }

código de auth.service.ts

return this._httpClient.post(''LoginAction'', credentials) .map(res => res.json()) .subscribe(user => { return new User(user); });

Con promesas, la función de login devolvería Promesa, que eventualmente se transformaría en respuesta real del servidor. Pero con Observable esto no funcionará.

¿Hay alguna manera de hacer algo similar? Quiero evitar la necesidad de poner la suscripción dentro de la función de login component . Quiero poder hacer todo el trabajo en servicio y devolver el objeto real al component .

Además, traté de crear Promise , con toPromise Promise , pero sigo llegando a toPromise is not a function .

ps _httpClient es mi envoltorio alrededor de angular2 http en el que preparo la solicitud agregando algunos encabezados, etc.

editar

return this._httpClient.post(''LoginAction'', credentials) .map(res => res.json()) .toPromise(). <-- i keep getting that it is not a function then(user => { return new User(user); });

al hacer esto, mi componente obtendrá un objeto (que es lo que necesita), y en servicio podría hacer cosas adicionales (como guardar al usuario en el almacén local, una vez que lo haya registrado).

¿Y cambié a Promise , porque hacer lo mismo con Observable no funciona (o lo estoy haciendo mal)?

Veo que el objeto devuelto es Observable (antes de llamar a Promesa), pero no veo la función toPromise hecho.


Cuando llame a subscribe(...) se devuelve una Subscription que no tiene un toPromise() . Si mueve el código de subscribe al map , puede usar para toPromise() lugar de subscribe

return this._httpClient.post(''LoginAction'', credentials) .map(res => res.json()) .map(user => { return new User(user); }).toPromise();

y la persona que llama obtendrá una Promise donde puede obtener el valor usando

public login() { this._user = AuthService.getInstance().login(this._loginInfo) .then(result => { doSomething(); }); }

pero obtienes el mismo resultado si omites `.toPromise () y la persona que llama lo usa como

public login() { this._user = AuthService.getInstance().login(this._loginInfo) .subscribe(result => { doSomething(); }); }

donde la única diferencia es subscribe() lugar de then() y si el usuario de la biblioteca prefiere el estilo reactivo, preferirá usar subscribe() como solía hacerlo.


De la documentación de Angular2

Aconsejamos agregar esto en rxjs-extension.ts

``` // Observable class extensions import ''rxjs/add/observable/of''; import ''rxjs/add/observable/throw''; // Observable operators import ''rxjs/add/operator/catch''; import ''rxjs/add/operator/debounceTime''; import ''rxjs/add/operator/distinctUntilChanged''; import ''rxjs/add/operator/do''; import ''rxjs/add/operator/filter''; import ''rxjs/add/operator/map''; import ''rxjs/add/operator/switchMap''; ```

E importarlo en app.module.ts (Root Module) import ''./rxjs-extensions'';

Esto nos ayudará a prevenir más errores.


Necesita importar el operador Rx toPromise como

import ''rxjs/add/operator/toPromise'';

¡Aclamaciones!