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 Réponses :
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.
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.
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();
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
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.
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