2

将 rx.Observable 对象转换为函数中的“普通”对象的优雅方法是什么?

例如:

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

>>> print(foo())

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

我知道 subscribe 的返回是一个一次性对象,实现它的“丑陋”方式是:

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

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

谢谢。

4

1 回答 1

4

看一下Observable::to_blocking():它创建了一个BlockingObservable可强制转换为包含所有已发出项目的列表的列表。对于您的示例:

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

我还想指出您的第二个解决方案是危险的,因为无法保证确切何时发出值,并且您__call__依赖于'value'立即发出。

于 2017-09-10T15:34:26.440 回答