0
votes

RXJS: Comment puis-je fabriquer des valeurs d'émettrices observables après abonnement?

J'ai créé une matrice de chaîne normale et a été déserté d'être observable à partir de celui-ci en utilisant "à partir de" xxx pré>

si je pousse une valeur à la matrice d'origine avant de vous abonner, je reçois cette valeur dans Le flux de données. P> xxx pré>

Toutefois, si je pousse un autre élément sur le tableau d'origine avant l'abonnement, rien ne se passe (il ne se comporte pas de manière réactive) P>

strArr.push("coke")

fsa.subscribe(
  x=>console.log(x) // outputs -> aaaa bbbb cccc coke
) 

strArr.push("pepsi") // Still outputs -> aaaa bbbb cccc coke.


5 commentaires

à partir de n'émet que des éléments dans les tableaux et n'émettra pas de manipulation d'objet de tableau


Je vois ... cependant, si j'écris à nouveau la pièce de code d'abonnement ci-dessous strarr.push ("pepsi") , je vois le résultat souhaité imprimé ("AAA BBBB CCCC COKE PEPSI"). Et il y a encore une modification de tableau.


C'est parce que de fait toujours référence au même tableau, c'est pourquoi vous obtenez le résultat mis à jour. Tableau est stocké comme un pointeur sur un objet de tableau dans JS


Merci pour votre temps. Pourriez-vous me recommencer une autre ou une méthodologie, en utilisant RSJX afin que je puisse enquêter sur ce que j'essaye de faire? (Je viens d'apprendre que rxjs). Je ne veux pas que le travail soit fait pour moi, juste un indice ... merci, mon pote.


Je vais ajouter une réponse suggérer une autre approche


3 Réponses :


1
votes

Avec un tableau, ce n'est pas si facile, mais au lieu d'un tableau, vous pouvez utiliser un sujet.

La question suivante: Avez-vous besoin de vous un tableau, ou est-ce bien d'utiliser un sujet à la place? P>

const stream$ = new ReplaySubject();
stream$.next('aaa');
stream$.next('bbb');
stream$.next('ccc');

stream$.subscribe(console.log); // [aaa bbb ccc]

stream$.next('ddd');
stream$.subscribe(console.log); // [aaa bbb ccc ddd], and the first subscription gets just 'ddd'.


3 commentaires

Ce que je voulais, c'était d'éviter de vous abonner après la valeur suivante. J'avais pensé à ceci: Constrar ferr = ['AAA', "BBB", "CCC"]; const fsa = de (tort); Strarr.Push ("Coke"); fsa.subscribe (x => console.log (x)); Strarr.Push ("Coke"); / * imprime jusqu'à "Coke" / fsa.subscribe (x => console.log (x)); Strarr.Push ("Pepsi"); fsa.subscribe (x => console.log (x)); / imprime tout * / mais le bloc de code est le même que le vôtre, je veux dire que je suis à nouveau abonné. Puissiez-vous me fournir la mise à jour? Merci beaucoup, mon pote.


Désolé pour le gâchis, je ne sais pas comment coller du code dans des commentaires afin qu'il soit lisible et en retrait. :(


Vous n'avez pas besoin de vous abonner la 2e fois. C'était un exemple. Une fois que .NEXT ('ddd') est appelé le premier abonnement obtiendra ddd .



2
votes

Une autre alternative consiste à combiner comportemortorsubject avec javascript proxy pour surveiller tous les types de modifications de la matrice xxx


0 commentaires

-1
votes

J'ai trouvé une solution pour ce que j'essaie de faire. (Faites réagir l'observateur à de nouvelles changements dans la matrice après l'abonnement, j'espère que cela peut aider à ceux qui répondent à des questions similaires:

import { ReplaySubject } from 'rxjs';

const rSubject$ = new ReplaySubject();

const rSubjAsObs = rSubject$.asObservable();

// string
const str =  "I am afraid I can not do that, Dave";
//string no spaces
let strNoSpace = str.replace(/\s+/g, ''); 
//word array
let srtArr = str.split(' ');

srtArr.forEach(word=>rSubject$.next(word))

rSubjAsObs.subscribe(
  data=>console.log(data)
)

rSubject$.next("...said the good machine");


0 commentaires