1
votes

Pourquoi la prise déclenche-t-elle l'observable?

Pourquoi? Voulez-vous partager la raison et s'il s'agit d'une mise en œuvre correcte? Notez que je ne m'abonne à cette fonction nulle part ailleurs, mais je continue de diffuser le résultat.

voici où j'appelle la méthode et renvoie une réponse avec un en-tête d'autorisation

function async userLogin(identifier) {
    return await login(identifier).toPromise();
}

et last but not least, cette fonction est convertie en promesse et la réponse est renvoyée sous forme de requête http

  public login(identifier): Observable<any> {
    return generateToken(identifier).pipe(
      catchError((err: Error) => of(err)),
      map(token => {
       return {'Authorization': token}
      }));
  }

Merci pour votre temps et votre patience


3 commentaires

Veuillez fournir le code où vous dirigez et vous abonnez


Ajout du code supplémentaire


ça l'est, mais l'idée est d'éviter d'utiliser des rappels, c'est la raison pour laquelle je l'ai enveloppé autour de l'observable. plus le code fonctionne comme prévu, mais je ne trouve nulle part pourquoi le take (1) déclenche l'observable


3 Réponses :


0
votes

Essayez

.pipe( take );

Ou

.pipe( () => take(1) );

Le même comportement se produit dans les promesses. Le rappel veut une fonction et non une instruction.


3 commentaires

Salut Wayne, merci pour votre réponse, mais la fonction fonctionne, même si je ne comprends pas les mécanismes derrière cela et les conséquences possibles. Pouvez-vous expliquer pourquoi?


Je suis perdu pour expliquer la mécanique du comportement. Je soupçonne que vous pouvez placer une fonction dans la file d'attente à exécuter après un événement mais que vous ne pouvez pas mettre en file d'attente une déclaration. Ainsi, l'instruction est exécutée lorsqu'elle est analysée, mais la fonction n'est pas exécutée avant l'événement. Je suppose que dans une erreur, take (1) est exécuté de toute façon et "() => take (1)" ne s'exécuterait que dans la situation sans erreur. En d'autres termes, l'instruction est toujours exécutée.


.pipe (take) devrait également fonctionner, il se résout en une fonction. Je n'y ai pas pensé en premier; Je suis toujours par défaut sur la fonction de grosse flèche, donc je sais que je passe une fonction lorsque je lis du code qui a été écrit avant le déjeuner hier.



1
votes

Ceci explique votre problème:

} else if (token) {
  observer.next(token);
  observer.complete();  <---
}

La promesse est résolue à la fin de l'Observable ou la rejette en cas d'erreur. Valeur observable et la complète.

Vous pouvez également obtenir la sortie si vous la complétez. Et cela semble un peu plus approprié:

return await login(identifier).toPromise();


1 commentaires

c'était en effet la réponse. Donc si je comprends bien, la prise est responsable de compléter l'observable au premier résultat, ce qui revient à compléter l'observable moi-même



1
votes

take (1) s'assure que la méthode subscription.complete () est appelée juste après l'émission du premier élément. BTW, cela peut être fait directement en appelant observer.complete () après observer.next () .

toPromise ( ) ne sera résolu qu'une fois le flux terminé, pas à chaque émission.


0 commentaires