尝试将值注入发布者,但收到无序值

Trying to inject values into a publisher, but receiving unordered values

这是对我试图使用 combine 实现的目标的过度简化。
如果发生某些事情,我需要向共享发布者注入一个值。 在这里你看到如果地图接收到数字 2 我使用原始发布者上的发送命令注入数字 3.
我希望收到一个数字序列,但我在触发它的事件之前收到了数字 3。

let pub = PassthroughSubject<Int, Never>()

let pubSharered = pub.share().eraseToAnyPublisher()

let anyCanc = pubSharered
.map { value -> Int in
        switch value {
        case 2:
            pub.send(3)
            return value
        default:
            return value
        }
}.sink { (value) in
    print("Sink: \(value)")
}

pub.send(0)
pub.send(1)
pub.send(2)
pub.send(4)

输出是:0,1,3,2,4 我期待的是 0,1,2,3,4
有人可以解释一下吗?

这似乎是 flatMap 的一个用例。你可以像这样平面映射到 Publishers.Sequence<[Int], Never>

let anyCanc = pubSharered
    .flatMap { value -> Publishers.Sequence<[Int], Never> in
        switch value {
        case 2:
            return [value, 3].publisher // value, plus a 3
        default:
            return [value].publisher // change nothing
        }
}.sink { (value) in
    print("Sink: \(value)")
}