0
votes

pipe asynchrone ne fonctionne pas correctement avec des comportementsB. de la canalisation avec du retard

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 $ code> sujet de comportement, que je m'abonne au composant.

Mon problème est chaque fois que j'exécute la fonction 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>

Qu'est-ce qui pourrait être la cause de ce comportement et comment le réparer? P>

Service de discussion strong> 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>


3 commentaires

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" Vous voulez dire que vous voyez les messages imprimés sur la console par mappe (ms => {console.log (MS) ; renvoyer MS}) ?


oui mais après 3 secondes


4 Réponses :


0
votes

Service de discussion
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})
    );

}


2 commentaires

et où l'écouteur de messages est utilisé?


@ Yehiaa.salam pls vérifier maintenant



0
votes

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 xxx pré>

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


2 commentaires

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.



0
votes

Peut-être peut-être que vous aide lorsque vous utilisez un replaysubject au lieu d'un comportementalsubject .
replaysubjects 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.

Voir cette https://stackoverflow.com/a/57214877/6537157 pour plus de détails.


0 commentaires

1
votes

J'ai répliqué votre Code et je pense que cela fonctionne bien maintenant maintenant

u avez plusieurs problèmes avec celui-ci

1- Sauvegarde d'état dans ce.Messages à Chatservice est une mauvaise idée BCS U utilisez ComportorSubject Utilisez ensuite ComportementsSubject.Value , ce.Messages $ .Value a votre dernier message [].

2- Evolution d'édition n'est pas bonne chose peut-être peut-être bcs de l'informatique et MANCHANTETECTIONSTRAGY.ONPUSH Vous avez des problèmes xxx

créer un nouveau tableau pour ajouter un nouveau message xxx

// mineur One

3 - Lorsque vous utilisez WhendAay en cas d'année, utilisez Intervalle (0) au lieu de (Undefine) BCS d'abord, a du sens si vous y réfléchissez xxx


1 commentaires

Grands œuvres maintenant, merci d'avoir mis le temps d'aider et des suggestions