J'ai un comportement très étrange tout en travaillant avec des observables angulaires et RxJS. J'ai un composant et un service. Le service a un sujet public Mon problème est chaque fois que j'exécute la fonction Qu'est-ce qui pourrait être la cause de ce comportement et comment le réparer? P> Service de discussion strong> P> $ code> sujet de comportement, que je m'abonne au composant.
suivante code> sur le sujet du comportement dans le sujet Service de chat, l'opérateur
async code> dans le HTML semble ignorer tous les opérateurs du tuyau dans le composant, y compris le
retardant code> opérateur. Bien que l'opérateur code> mappe code> suit la droite behhavior et exécute après des secondes. P>
<div class="cl-message-block" *ngFor="let m of (messages$ | async)" [@fadeIn] [class.sent]="!m.agent_id">
<div class="cl-message" [ngClass]="{ 'cl-received': (m.agent_id), 'cl-sent': (!m.agent_id) }">
{{ m.message}}
<span>{{ m.created_at | messageTime }}</span>
</div>
</div>
<charla-typing-indicator *ngIf="show_typing_indicator"></charla-typing-indicator>
4 Réponses :
import { ChartService } from ''; import { Subscription } from 'rxjs'; constructor( private chatService: ChartService ) {} messageSubscription: Subscription; ngOninit(){ this.messageSubscription = this.messagesListner.messages.pipe( delayWhen( ms => { /* This is ignore altogether by the async in the html component */ let m = ms[ms.length - 1]; if (m.is_bot) { this.show_typing_indicator = true; setTimeout( () => this.show_typing_indicator = false, 3000 ); return interval(3000); } else return of(undefined); }), map( ms => {console.log(ms); return ms}) ); }
et où l'écouteur de messages est utilisé?
@ Yehiaa.salam pls vérifier maintenant
Comportementsbjects ont une valeur initiale, nous ne voyons pas où vous l'avez défini dans votre code, mais généralement que la première valeur est initialisée à NULL ou non définie. Vous ne faites pas de chèques nuls dans votre corps de retard. Enveloppez cela dans un et voir si cela change votre sortie. P> Vous initialisez des messages $ quelque part ... n'est-ce pas? P> ....pipe(
// Assorted RxJS operators go here
// either this:
catchError((err) => {
console.log(err);
return throwError(err); // re-throw it if you might want to also see the error downstream
}
// or this:
catchError((err) => {
console.log(err);
return of<MyType>(undefined); // return a clean (typed) observable if you don't want the error downstream
}
});
J'ai ajouté le code d'initialisation à la question, je l'initialise déjà avec un tableau afin de ne pas penser que c'est le problème
Cela semble bon. Donc, je suis d'accord avec vous que le chèque null n'est probablement pas le problème. Mais je recommanderais une simple manipulation d'erreurs, même si elle est juste pour tester / déterminer ce qui se passe vraiment.
Peut-être peut-être que vous aide lorsque vous utilisez un Voir cette https://stackoverflow.com/a/57214877/6537157 pour plus de détails. P> replaysubject code> au lieu d'un
comportementalsubject code>.
replaysubjects code> n'a aucune valeur initiale et lorsque vous n'avez pas besoin de valeurs initiales (ou en d'autres termes: valeurs par défaut), vous devez les utiliser. P>
J'ai répliqué votre Code et je pense que cela fonctionne bien maintenant maintenant
u avez plusieurs problèmes avec celui-ci P>
1- Sauvegarde d'état dans ce.Messages à Chatservice est une mauvaise idée forte>
BCS U utilisez ComportorSubject fort> Utilisez ensuite ComportementsSubject.Value Strong>, ce.Messages $ .Value a votre dernier message []. P> 2- créer un nouveau tableau pour ajouter un nouveau message P> // mineur One P > 3 - Lorsque vous utilisez WhendAay en cas d'année, utilisez Intervalle (0) Strong> au lieu de (Undefine) BCS d'abord, a du sens si vous y réfléchissez p>
Grands œuvres maintenant, merci d'avoir mis le temps d'aider et des suggestions
Peut-être ce lien aide Github.com/reactivex/rxjs/issues/5318
"Bien que l'opérateur de la carte suit la bonne behavior et exécute après des secondes" i> Vous voulez dire que vous voyez les messages imprimés sur la console par
mappe (ms => {console.log (MS) ; renvoyer MS}) CODE>?
oui mais après 3 secondes