【问题标题】:CombineLatest first event not firingCombineLatest 第一个事件未触发
【发布时间】:2018-05-13 01:14:14
【问题描述】:

我想知道我的应用程序何时脱机并重新联机。我在rxjs注册了以下事件:

const online = Rx.Observable.fromEvent(window, 'online');
const offline = Rx.Observable.fromEvent(window, 'offline');

const source = Rx.Observable.combineLatest(online, offline).map(() => navigator.onLine);

source.subscribe(result => {
  console.log('I\'m online: ' + (result ? 'jup' : 'nope'));
});

但是,当我第一次下线时,事件并没有被触发,尽管如果我添加常规的 addEventListener 事件,我发现它们会被很好地触发:

window.addEventListener('online', () => console.log('online triggered'));
window.addEventListener('offline', () => console.log('offline triggered'));

以this jsbin 为例,通过devtools 切换您的网络,您将看到它第一次无法登录I'm online: ...。

【问题讨论】:

    标签: javascript rxjs rxjs5


    【解决方案1】:

    combineLatest 运算符要求所有源 Observable 至少发出一个值。

    对你来说,这意味着你应该初始化每个流,然后只听变化:

    const source = Rx.Observable.combineLatest(
        online.startWith(null),
        offline.startWith(null),
      )
      .skip(1)
      .map(() => navigator.onLine)
    

    如果你想知道navigator.onLine的初始状态,也许你甚至不需要使用skip(1)。

    【讨论】:

    • 谢谢,确实 skip 在我的情况下不是必需的。
    • 谢谢@martin!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    • 2019-02-10
    相关资源
    最近更新 更多