2017-09-05 64 views
1

将rx.Observable对象转换为函数中的“普通”对象的优雅方式是什么?通过rxpy从可观察值返回值

如:

def foo(): 
    return rx.Observable.just('value').subscribe(<some magic here>) 

>>> print(foo()) 

# expected: 
# value 
# however get: 
# <rx.disposables.anonymousdisposable.AnonymousDisposable at SOME ADDRESS> 

我理解订阅的那回报是一次性的对象,和“丑陋”的方式来实现,这是:

class Foo: 
    def __init__(self): 
     self.buffer = None 

    def call_kernel(self): 
     rx.Observable.just('value').subscribe(lambda v: self.buffer = v) 

    def __call__(self): 
     self.call_kernel() 
     return self.buffer 
>>> Foo() 

# get: 
# value 

有没有更好的方式来做到这一点?

谢谢。

回答

3

看看Observable::to_blocking():它会创建一个BlockingObservable,它可以强制包含所有发出的项目。对于你的例子:

def foo(): 
    return list(rx.Observable.just('value').to_blocking())[0] 

我也想指出你的第二个解决方案是很危险的,因为不能保证什么时候值将被发出,而你的__call__依靠'value'立即发出。