Angular2 Observable et promesse

J'ai commencé à utiliser Angular2 Observable, mais je ne trouve pas quelque chose de similaire à .then que j'ai utilisé avec Promises.

C'est ce que je veux accomplir.

Code de l'en-tête.composant.ts

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

Code de auth.service.ts

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

Avec promises, la fonction login retournerait Promise, qui finirait par se transformer en réponse réelle du serveur. Mais avec Observable cela ne fonctionnera pas.

Est-il un moyen de faire la même chose? Je veux éviter le besoin de mettre subscribe dans la fonction login de component. Je veux être capable de faire tout le travail en service, et de retourner l'objet réel à component.

Aussi, j'ai essayé de créer Promise, avec toPromise, mais je reçois toPromise is not a function.

P. S. _httpClient est mon wrapper autour du http angular2 dans lequel je prépare la requête en ajoutant des en-têtes, etc.

Modifier

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);
});

En faisant cela, mon composant obtiendra l'objet (ce dont il a besoin), et en service je pourrais faire des choses supplémentaires (comme enregistrement de l'utilisateur à localstorage, une fois que je l'ai connecté).

Et je suis passé à Promise, parce que faire de même avec Observable ne fonctionne pas (ou je le fais mal)?

Je vois que l'objet retourné est Observable (avant d'appeler toPromise), mais je ne vois pas la fonction toPromise en effet.

34
demandé sur Ned 2016-04-15 16:16:39

3 réponses

Lorsque vous appelez subscribe(...) un Subscription est retourné qui n'ont pas de toPromise(). Si vous déplacez le code de subscribe à map, vous pouvez utiliser toPromise() au lieu de subscribe

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

Et l'appelant obtiendra un Promise où il peut obtenir la valeur en utilisant

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

, Mais vous obtenez le même résultat si vous omettez `.toPromise () et l'appelant l'utilise comme

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

Où la seule différence est subscribe() au lieu de then() et si l'utilisateur de la bibliothèque préfère le style réactif, il préférera utiliser subscribe() comme il est habitué.

33
répondu Günter Zöchbauer 2016-04-15 13:21:57

Vous devez importer L'opérateur RX toPromise comme

import 'rxjs/add/operator/toPromise';

Cheers!

22
répondu dheeran 2016-05-04 16:04:40

De la documentation Angular2

Nous conseillons d'ajouter 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'; 
```

Et l'importer à app.module.ts (Module racine) import './rxjs-extensions';

Cela nous aidera à éviter d'autres erreurs.

2
répondu YoongKang Lim 2016-09-27 19:13:48