处理 ajax 请求 - Promise 与 RxJs 可观察 - rxjs 运营商偏好

Handling ajax request - Promise vs RxJs observable - rxjs operator preferences

我正在使用 Rxjs Observables 来处理嵌套的 ajax 请求,如下所示:

Rx.Observable.fromPromise($.getJSON('list1.json'))
   .switchMap(function responseA(aResponse){
       /* processing aResponse*/
       if(aResponse.fileName){
          return Rx.Observable.fromPromise($.getJSON(aResponse.fileName));
       } 
       return Rx.Observable.fromPromise($.getJSON('list2.json'));
   })
   .subscribe(function(finalResponse){
      /* processing finalResponse */
   });

但是,如您所知,它也可以不使用 Observables 而只使用 promises 来完成:

   $.getJSON('list1.json')
       .then(function responseA(aResponse){
           /* processing aResponse*/
           if(aResponse.fileName){
              return $.getJSON(aResponse.fileName);
           } 
           return $.getJSON('list2.json');
       })
       .then(function(finalResponse){
          /* processing finalResponse */
       });

两种代码都有效,但在我看来,使用 promises 在代码方面更简洁。

我是否遗漏了什么,因为我认为 Rx Observable 在处理异步请求方面更加标准和高效。

就处理 ajax 请求的代码组织、约定和性能而言,哪一个(promise 或 Observable)最好?

如果我更喜欢使用 Observable,那么在这种情况下哪种运算符 (switchMap/MergeMap) 更可取?

Am I missing something here as I've heart that Rx Observable is more standard and efficient to handle asynchronous requests.

不,你没有遗漏任何东西。 Rx 确实很有用,但在特定情况下,基于 promise 的代码更简单。

一般来说,如果您需要一个奇异值 - 更喜欢 promise。如果您需要多个值 in/out - 使用 observables(或更先进的规范异步迭代器)。

Rx 会很好,如果你想快速需要添加:

  • 如果请求失败则重试请求(Observable.defer)。
  • 只关心最后一个请求。
  • 如果您需要内置取消功能。

值得一提的是 - 如果您使用库,promises 可以完成所有这些工作。它不是可观察量的基本 属性。

如果您的输入不止一次调用,Rx 真的很出色。如果您需要在用户点击某些东西时进行这些调用,忽略某些条件下的点击,将其去抖动到 100 毫秒,然后只关心最后一次调用 - Rx 将非常有用。

在这种特殊情况下 - 承诺更简单也更好。您的承诺代码可以进一步简化:

$.getJSON('list1.json').then(x => $.getJSON(x.fileName || 'list2.json'))

网络上有几篇非常好的文章,这里是其中的几篇,我希望它们能帮助您正确理解它们之间的区别。

  1. What Promises Do That Observables Can’t

  2. https://egghead.io/lessons/rxjs-rxjs-observables-vs-promises