RxPy - Exemplos

Neste capítulo, discutiremos os seguintes tópicos em detalhes -

  • Exemplo básico mostrando o funcionamento do observável, operadores e assinando o observador.
  • Diferença entre observável e sujeito.
  • Compreendendo os observáveis ​​quentes e frios.

A seguir, é fornecido um exemplo básico que mostra o funcionamento do observável, dos operadores e da assinatura do observador.

Exemplo

test.py

import requests
import rx
import json
from rx import operators as ops
def filternames(x):
   if (x["name"].startswith("C")):
      return x["name"]
   else :
      return ""
content = requests.get('https://jsonplaceholder.typicode.com/users')
y = json.loads(content.text)
source = rx.from_(y)
case1 = source.pipe(
   ops.filter(lambda c: filternames(c)),
   ops.map(lambda a:a["name"])
)
case1.subscribe(
   on_next = lambda i: print("Got - {0}".format(i)), 8. RxPy — Examples
   on_error = lambda e: print("Error : {0}".format(e)),
   on_completed = lambda: print("Job Done!"),
)

Aqui está um exemplo muito simples, em que estou obtendo dados do usuário a partir deste URL -

https://jsonplaceholder.typicode.com/users.

Filtrando os dados, para dar os nomes começando com "C", e depois usando o mapa para retornar apenas os nomes. Aqui está a saída para o mesmo -

E:\pyrx\examples>python test.py
Got - Clementine Bauch
Got - Chelsey Dietrich
Got - Clementina DuBuque
Job Done!

Diferença entre observável e sujeito

Neste exemplo, veremos a diferença entre um observável e um sujeito.

from rx import of, operators as op
import random
test1 = of(1,2,3,4,5)
sub1 = test1.pipe(
   op.map(lambda a : a+random.random())
)
print("From first subscriber")
subscriber1 = sub1.subscribe(lambda i: print("From sub1 {0}".format(i)))
print("From second subscriber")
subscriber2 = sub1.subscribe(lambda i: print("From sub2 {0}".format(i)))

Resultado

E:\pyrx>python testrx.py
From first subscriber
From sub1 1.610450821095726
From sub1 2.9567564032037335
From sub1 3.933217537811936
From sub1 4.82444905626622
From sub1 5.929414892567188
From second subscriber
From sub2 1.8573813517529874
From sub2 2.902433239469483
From sub2 3.2289868093016825
From sub2 4.050413890694411
From sub2 5.226515068012821

No exemplo acima, cada vez que você assina o observável, ele fornecerá novos valores.

Exemplo de Assunto

from rx import of, operators as op
import random
from rx.subject import Subject
subject_test = Subject()
subject_test.subscribe(
   lambda x: print("From sub1 {0}".format(x))
)
subject_test.subscribe(
   lambda x: print("From sub2 {0}".format(x))
)
test1 = of(1,2,3,4,5)
sub1 = test1.pipe(
   op.map(lambda a : a+random.random())
)
subscriber = sub1.subscribe(subject_test)

Resultado

E:\pyrx>python testrx.py
From sub1 1.1789422863284509
From sub2 1.1789422863284509
From sub1 2.5525627903260153
From sub2 2.5525627903260153
From sub1 3.4191549324778325
From sub2 3.4191549324778325
From sub1 4.644042420199624
From sub2 4.644042420199624
From sub1 5.079896897489065
From sub2 5.079896897489065

Se você ver que os valores são compartilhados, entre os dois assinantes usando o assunto.

Compreendendo os observáveis ​​quentes e frios

Um observável é classificado como

  • Observáveis ​​Frios
  • Observáveis ​​quentes

A diferença nos observáveis ​​será notada quando vários assinantes estiverem se inscrevendo.

Observáveis ​​Frios

Observáveis ​​frios, são observáveis ​​que são executados e renderizam dados cada vez que são inscritos. Quando é inscrito, o observável é executado e os novos valores são fornecidos.

O exemplo a seguir fornece a compreensão do frio observável.

from rx import of, operators as op
import random
test1 = of(1,2,3,4,5)
sub1 = test1.pipe(
   op.map(lambda a : a+random.random())
)
print("From first subscriber")
subscriber1 = sub1.subscribe(lambda i: print("From sub1 {0}".format(i)))
print("From second subscriber")
subscriber2 = sub1.subscribe(lambda i: print("From sub2 {0}".format(i)))

Resultado

E:\pyrx>python testrx.py
From first subscriber
From sub1 1.610450821095726
From sub1 2.9567564032037335
From sub1 3.933217537811936
From sub1 4.82444905626622
From sub1 5.929414892567188
From second subscriber
From sub2 1.8573813517529874
From sub2 2.902433239469483
From sub2 3.2289868093016825
From sub2 4.050413890694411
From sub2 5.226515068012821

No exemplo acima, toda vez que você assinar o observável, ele executará o observável e emitirá valores. Os valores também podem diferir de assinante para assinante, conforme mostrado no exemplo acima.

Observáveis ​​quentes

No caso de hot observable, eles emitirão os valores quando estiverem prontos e nem sempre aguardarão por uma assinatura. Quando os valores são emitidos, todos os assinantes receberão o mesmo valor.

Você pode usar o observável quente quando quiser que os valores sejam emitidos quando o observável estiver pronto, ou quiser compartilhar os mesmos valores com todos os seus assinantes.

Um exemplo de observável quente são os operadores sujeitos e conectáveis.

from rx import of, operators as op
import random
from rx.subject import Subject
subject_test = Subject()
subject_test.subscribe(
   lambda x: print("From sub1 {0}".format(x))
)
subject_test.subscribe(
   lambda x: print("From sub2 {0}".format(x))
)
test1 = of(1,2,3,4,5)
sub1 = test1.pipe(
   op.map(lambda a : a+random.random())
)
subscriber = sub1.subscribe(subject_test)

Resultado

E:\pyrx>python testrx.py
From sub1 1.1789422863284509
From sub2 1.1789422863284509
From sub1 2.5525627903260153
From sub2 2.5525627903260153
From sub1 3.4191549324778325
From sub2 3.4191549324778325
From sub1 4.644042420199624
From sub2 4.644042420199624
From sub1 5.079896897489065
From sub2 5.079896897489065

Se você ver, o mesmo valor é compartilhado entre os assinantes. Você pode conseguir o mesmo usando o operador observável conectável publish ().