Observable 只发出一个值?

Posted

技术标签:

【中文标题】Observable 只发出一个值?【英文标题】:Observable only emits one value? 【发布时间】:2021-01-23 22:01:06 【问题描述】:

我是 RxSwift 的新手,我在控制台中截取了这段代码:

下一个(第二个值)

完成

但我期待这个结果:

下一个(第一个值)

下一个(第二个值)

完成

为什么没有对两次订阅做出反应?我知道在反应中,当我们观察到的变量发生变化但代码没有显示这一点时,observable 会发出并触发订阅。我误解了这个概念吗?

var mutableString = "first value"
mutableString = "second value"

var stringObservable: Observable<String> = Observable.of(mutableString)
        
stringObservable.subscribe  event in
    print(event)

【问题讨论】:

【参考方案1】:

程序运行时,会一步一步地遍历每一行代码。所以首先它创建变量mutableString 并为其分配“第一个值”。然后在下一行中,它将“第二个值”分配给变量。

然后它创建Observable&lt;String&gt; 类型的变量stringObservable 并将Observable.of(mutableString) 分配给它,因为mutableString 包含“第二个值”,这就是分配Observable 内部的值。

请注意,Observable 内部有自己的变量,因此更改 mutableString 的值不会影响 Observable。

要获得您正在寻找的输出,您需要在创建时传递您希望 Observable 输出的所有值,如下所示:

let stringObservable: Observable<String> = Observable.of("first value", "second value")
stringObservable.subscribe  event in
    print(event)

另一种选择是创建一个具有输出值的函数的 Observable:

func makeObservable(from array: [String]) -> Observable<String> 
    Observable<String>.create  observer in
        for each in array 
            observer.onNext(each)
        
        observer.onCompleted()
        return Disposables.create()
    

这基本上就是 Observable 的 of(_:) 操作符的实现方式。每次订阅生成的 Observable 时,它​​都会运行传递给 create 函数的闭包,导致它再次发出两个值(以及完成的事件)。

【讨论】:

感谢您的回复,现在我看到了我修改变量而不是可观察对象本身的问题。更多人认为有一种方法可以将元素添加到可观察对象,但不在 create 或 of 中,我的意思是在 of 或 create 中使用一些值初始化观察,然后在代码中添加更多值,执行类似 stringObservable.value = 的操作“第三个元素”或StringObservable.onNext(“第三个元素”),我看到有些人后来使用了一个变量,他们用asObservable()进行了转换,并且可以做像StringObservable.value =“第三个元素”这样的事情Observables可能不允许? 您可以使用 Subject 并在主题上调用 asObservable() 以从中获取 observable(Variable 是一种未弃用的主题形式。)主题提供了方便戳 Rx 的方法,但不建议将它们用于日常使用。最好是建立一个不变量,它会导致 Observable 发出值,而不是没有特定原因发出的东西。

以上是关于Observable 只发出一个值?的主要内容,如果未能解决你的问题,请参考以下文章

在发出两个 observable 的第一个值后,Zip 没有发出值

RxJS之过滤操作符 ( Angular环境 )

RxJs。如果我有两个 observable,如何抛出错误并继续发出值?

如何获得仅在 redux 状态的对象数组中的属性值更改时才发出的 Observable?

Rxjava2 Observable的创建详解及实例

观察 Vue Observable 的变化