RxJS相当于Promise.resolve()

时间:2017-02-09 10:02:55

标签: javascript angular rxjs

等同于Promise.resolve()的是什么(没有任何价值的解决很重要)?

这里有一个类似的问题:rxjs alternative to doing a Promise.resolve?

如果我们提供任何数据,给定的解决方案(Observable.of(data))运行良好,但如果我们没有提供对我有意义的值,因为没有值,这不起作用,所以{{1}不被解雇。

在ionic2应用程序的Angular2服务中,我正在尝试将基于Promise的服务迁移到Observables。如果设备处于脱机状态,我需要跳过序列的某些步骤。有了承诺,我抛出一个错误,然后在序列中捕获它:

.subscribe()

以下代码不会:

return this.connectivityService.isOnline()
  .flatMap((isOnline: boolean) => {
    if (isOnline) {
      return Promise.resolve(); // work as expected, subscribe() is called
    } else {
      return Observable.throw(new OfflineError('The device is offline.'));
    }
  })
  .do(() => console.log('Do things here'));

是否可以通过可观察对象实现相同的目标?如果我对可观察量的使用不好,请随时告诉我,这对我来说是新的。

1 个答案:

答案 0 :(得分:1)

以直接方式回答问题:

相当于Promise.resolve()将是Observable.of(undefined) - 但通常您可以避免此类变通办法。

您是否简化了代码?因为在你的情况下,你实际上不必在这里使用flatMap,你也可以直接抛出错误:

return this.connectivityService.isOnline()
  .do((isOnline: boolean) => {
    if (!isOnline) {
      throw new OfflineError('The device is offline.');
    }
  })
  .do(() => console.log('Do things here'));



const isOnline$ = new Rx.BehaviorSubject(false); // some online-check-service-mock

isOnline$
  .do(isOnline => {
    if (!isOnline) {
      throw new Error("You are offline!");  
    }
  })
  .do(() => console.log('Do things here'))
  .subscribe(
    console.log,
    error => console.error("Oops! ", error.message),
    console.info
  );

<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>
&#13;
&#13;
&#13;