【问题标题】:rxjs finally executed before promise resolvesrxjs 最终在 promise 解决之前执行
【发布时间】:2018-03-31 03:46:15
【问题描述】:

以下是我的代码的简化版本。问题是 finally 块比我想要的要早执行。我希望它仅在所有其他 Observables 完成后执行。

let data1 = 'test1'
let data2 = 'test2'

const input = Rx.Observable.from([data1, data2])
    .finally(() => {
    console.log('end')
  })

let output = input.concatMap((text) => {
  let promise = Promise.resolve(text)
  return Rx.Observable.fromPromise(promise)
})

output.subscribe((x) => {console.log(x)})

输出:

end
test1
test2

预期输出:

test1
test2
end

【问题讨论】:

  • 你为什么期望这个输出? concatMap 被添加到之后 finally
  • 对不起,这就是我需要它的行为方式,因此我的问题。我需要一个替代品
  • 另外,从concatMap 中删除异步/承诺确实会产生预期的输出......行为上的奇怪差异?

标签: javascript promise rxjs observable es6-promise


【解决方案1】:

您遇到的问题是Observable.from 立即发出所有内容并完成。然后两个发射都在concatMap 中缓冲,但源已经完成,所以调用finally 块。

您可以做的最简单的事情就是将finally 块放在concatMap 之后,因为那才是真正完成的时候:

const data1 = 'test1';
const data2 = 'test2';

const input = Observable.from([data1, data2]);

const output = input
  .concatMap(text => Promise.resolve(text))
  .finally(() => console.log('end'));

output.subscribe(console.log);

查看现场演示(打开控制台):https://stackblitz.com/edit/rxjs5-hnesmn?file=index.ts

顺便说一句,如果您在Observable.from 之后真的需要.finally,您将无法获得您想要的输出,因为.finallyObservable.from 被处理(完成或​​错误)时被调用,这与链无关接下来。换句话说,Observable.from 无法知道以下链何时完成。这甚至没有意义,因为 Rx 合约规定始终只有一个 completeerror 通知。但是,如果您使用例如。 Observable.from().finally().share() 那么你可以有多个订阅,什么会决定源 Observable 何时调用 finally()?它只能完成一次。

【讨论】:

    【解决方案2】:

    尝试改变订阅逻辑,看看你是否得到你要找的东西

    output.subscribe(
       (x) => {console.log(x)},
       error => console.error(error),
       () => console.log('Finally I have really reached the END')
    )
    

    【讨论】:

    • 这实际上对我不起作用,因为我需要客户向我传递一个可观察的(输入),客户需要知道何时到达终点。我的代码接受输入,在订阅前使用 concatMap 和异步调用对 observable 进行一些修改。我实际上是在将输入传递给 Angular 管道,因此例如也无法返回另一个主题。因此,我在地图和订阅之前对 finally 进行排序。
    • 你知道吗。我已将您的代码粘贴到我的环境中,我得到了您预期的输出,即test1 test2 end
    • 我添加了一个超时 jsfiddle.net/muqbppLg/2 。您的环境对此有何表现?
    • 你是对的。我的傻瓜。关键可能是您对要传递input 的管道有多少控制权。如果您可以创建它,那么您可能会找到实现您想要的策略。否则对我来说听起来很难。
    猜你喜欢
    • 2018-05-22
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 1970-01-01
    • 2020-12-02
    相关资源
    最近更新 更多