我有一个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()
。这没有帮助(因此我在上面的最小示例中未列出)。
我想念什么?
答案 0 :(得分:1)
通过将您的代码与the unit tests that RxPy has for the partition operator进行比较,看起来该代码几乎是正确的。
您处在正确的轨道上,您确实需要将请求Observable变为多播observable。
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!