分区可观察的第二流从未达到

时间:2018-08-09 09:29:11

标签: python reactive-programming rx-py

我有一个Observable处理Web请求,在这里我想在单独的流中处理成功或失败,这与this example非常相似。我的脚本和示例之间的主要区别在于,我不想合并流然后订阅。我正在将RxPY 1.6.1与Python 2.7一起使用。

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!'))

请求失败时,脚本将按预期打印failure!。但是,当响应为OK时,脚本不会打印success!。有趣的是,当您切换订阅的顺序时,success!确实会被打印,而failure!却永远不会到达。

我发现request可能无法多播,因此我尝试将publish()添加到可观察的request并在创建订阅后调用connect()。这没有帮助(因此我在上面的最小示例中未列出)。

我想念什么?

1 个答案:

答案 0 :(得分:1)

通过将您的代码与the unit tests that RxPy has for the partition operator进行比较,看起来该代码几乎是正确的。

您处在正确的轨道上,您确实需要将请求Observable变为多播observable。

Here is working code (tested on Repl.it, you will have to convert the list of requests back to the classes/objects you're using in your code)

from rx import Observable

def print_msg(message):
  print(message)

class Request(object):
  def __init__(self, status_code):
    self.status_code = status_code

request = Observable.of(
  Request(200),
  Request(404),
  Request(412),
  Request(200),
).publish()

request_success, request_failed = request.partition(lambda r: \
  r.status_code == 200)

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

请注意,一旦请求列表变成可观察对象,它就会被发布(Observable.of(...).publish()),只有 之后,我们在分区的可观察对象上进行订阅才称为connect。 >

输出为:

success!
failure!
failure!
success!