[RxPY] Deel gepartitioneerde Observable wordt nooit bereikt

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • TFBlunt
  • Registratie: November 2010
  • Laatst online: 04-09 11:25
Hoi allemaal,

Ik heb problemen met een script waarin ik a.d.h.v. een Observable een web request af wil handelen. Vervolgens wil ik de stream splitsen (success/failure). Als leidraad heb ik dit voorbeeld gebruikt. Het verschil zit hem er in dat ik de stream na het splitsen niet meer wil mergen.

Ik gebruik RxPY 1.6.1 in combinatie met Python 2.7. Mijn code ziet er als volgt uit:

Python:
1
2
3
4
5
6
request = Observable.of(requests.get(self.URL, params=request_params))

request_success, request_failed = request.partition(lambda r: r.status_code == requests.codes.ok)          

request_failed.subscribe(lambda r: print_msg('failure!'))
request_success.subscribe(lambda r: print_msg('success!'))


Wanneer de request faalt wordt er netjes failure! geprint. Echter wanneer de respone OK is, verschijnt er vervolgens geen success!.

Mijn eerste gedachte was dat request wellicht niet gemulticast kan worden. Dus heb ik publish() toegevoegd aan de Observable op rij 1. Vervolgens ook een request.connect() toegevoegd na het aanmaken van de subscriptions op rij 7. Dat heeft echter niet geholpen.

Wat mis ik nog?

Beste antwoord (via TFBlunt op 09-08-2018 22:07)


  • Sandor_Clegane
  • Registratie: Januari 2012
  • Niet online

Sandor_Clegane

Fancy plans and pants to match

TFBlunt schreef op donderdag 9 augustus 2018 @ 13:35:
[...]


[...]


Ik heb het voor alle zekerheid gedubbelcheckt, maar request_success en request_failed verwijzen inderdaad allebei naar verschillende Observables.

Klopt het dat het hier niet uitmaakt dat ik een enkele waarde als bron voor de stream gebruik, in plaats van een collectie zoals in het voorbeeld?

Overigens, wanneer je rij 5 en 6 wisselt, dus als volgt:

Python:
1
2
request_success.subscribe(lambda r: print_msg('success!'))
request_failed.subscribe(lambda r: print_msg('failure!'))


Wordt success wel geprint, maar failure niet meer.
Check dit eens: https://www.pertiller.tec...e-subscriptions-with-rxjs

Ik ken python niet, maar dit lijkt je probleem te zijn. Multiple subscribers op een observable.

Less alienation, more cooperation.

Alle reacties


Acties:
  • +1 Henk 'm!

  • 62696e617279
  • Registratie: November 2017
  • Laatst online: 09-12-2024
Ik heb niet bijzonder veel kennis van Python, dus ik kan het compleet mis hebben. Maar:
code:
1
request_success, request_failed = request.partition(lambda r: r.status_code == requests.codes.ok)


Alleen request_failed krijgt een waarde, moet request_success dan niet een vergelijkbare constructie ontvangen? Mijn eerste vermoeden is dat request_success een null waarde heeft, waarop je een subscribe probeert aan te roepen.

Acties:
  • +1 Henk 'm!

  • boe2
  • Registratie: November 2002
  • Niet online

boe2

'-')/

62696e617279 schreef op donderdag 9 augustus 2018 @ 13:13:
Ik heb niet bijzonder veel kennis van Python, dus ik kan het compleet mis hebben. Maar:
code:
1
request_success, request_failed = request.partition(lambda r: r.status_code == requests.codes.ok)


Alleen request_failed krijgt een waarde, moet request_success dan niet een vergelijkbare constructie ontvangen? Mijn eerste vermoeden is dat request_success een null waarde heeft, waarop je een subscribe probeert aan te roepen.
Python methods kunnen meerdere waardes teruggeven. In dit geval dient de partition methode om een collectie op te splitsen aan de hand van een lambda expressie.

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind.' - Pratchett.


Acties:
  • 0 Henk 'm!

  • TFBlunt
  • Registratie: November 2010
  • Laatst online: 04-09 11:25
62696e617279 schreef op donderdag 9 augustus 2018 @ 13:13:
Alleen request_failed krijgt een waarde, moet request_success dan niet een vergelijkbare constructie ontvangen? Mijn eerste vermoeden is dat request_success een null waarde heeft, waarop je een subscribe probeert aan te roepen.
boe2 schreef op donderdag 9 augustus 2018 @ 13:22:
Python methods kunnen meerdere waardes teruggeven. In dit geval dient de partition methode om een collectie observable object op te splitsen aan de hand van een lambda expressie.
Ik heb het voor alle zekerheid gedubbelcheckt, maar request_success en request_failed verwijzen inderdaad allebei naar verschillende Observables.

Klopt het dat het hier niet uitmaakt dat ik een enkele waarde als bron voor de stream gebruik, in plaats van een collectie zoals in het voorbeeld?

Overigens, wanneer je rij 5 en 6 wisselt, dus als volgt:

Python:
1
2
request_success.subscribe(lambda r: print_msg('success!'))
request_failed.subscribe(lambda r: print_msg('failure!'))


Wordt success wel geprint, maar failure niet meer.

[ Voor 12% gewijzigd door TFBlunt op 09-08-2018 13:58 ]


Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • Sandor_Clegane
  • Registratie: Januari 2012
  • Niet online

Sandor_Clegane

Fancy plans and pants to match

TFBlunt schreef op donderdag 9 augustus 2018 @ 13:35:
[...]


[...]


Ik heb het voor alle zekerheid gedubbelcheckt, maar request_success en request_failed verwijzen inderdaad allebei naar verschillende Observables.

Klopt het dat het hier niet uitmaakt dat ik een enkele waarde als bron voor de stream gebruik, in plaats van een collectie zoals in het voorbeeld?

Overigens, wanneer je rij 5 en 6 wisselt, dus als volgt:

Python:
1
2
request_success.subscribe(lambda r: print_msg('success!'))
request_failed.subscribe(lambda r: print_msg('failure!'))


Wordt success wel geprint, maar failure niet meer.
Check dit eens: https://www.pertiller.tec...e-subscriptions-with-rxjs

Ik ken python niet, maar dit lijkt je probleem te zijn. Multiple subscribers op een observable.

Less alienation, more cooperation.


Acties:
  • 0 Henk 'm!

  • TFBlunt
  • Registratie: November 2010
  • Laatst online: 04-09 11:25
Sandor_Clegane schreef op donderdag 9 augustus 2018 @ 14:52:
[...]


Check dit eens: https://www.pertiller.tec...e-subscriptions-with-rxjs

Ik ken python niet, maar dit lijkt je probleem te zijn. Multiple subscribers op een observable.
Thanks. Dat was de gouden tip. Door een Subject ipv een Observable te gebruiken kan ik inderdaad zowel success als failure bereiken. De code ziet er dan zo uit:
Python:
1
2
3
4
5
6
7
8
request = Subject()

request_success, request_failed = request.partition(lambda r: r.status_code == requests.codes.ok)          

request_failed.subscribe(lambda r: print_msg('failure!'))
request_success.subscribe(lambda r: print_msg('success!'))

request.on_next(requests.get(self.URL, params=request_params))

Acties:
  • 0 Henk 'm!

  • Sandor_Clegane
  • Registratie: Januari 2012
  • Niet online

Sandor_Clegane

Fancy plans and pants to match

Graag gedaan. :)

Less alienation, more cooperation.

Pagina: 1