处理Ajax请求 - 无极VS RxJs观察到 - rxjs

处理Ajax请求 - 无极VS RxJs观察到 - rxjs

问题描述:

我使用Rxjs观测量来处理类似下面的嵌套的方式Ajax请求操作者的要求:处理Ajax请求 - 无极VS RxJs观察到 - rxjs

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 */ 
    }); 

但是,正如你知道的,也可以不使用完成与只承诺观测:

$.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 */ 
     }); 

两个代码的工作,但在我看来,这是在代码中使用承诺条款更加干净。

我是否错过了这里的内容,因为我认为Rx Observable更加标准和高效地处理异步请求。

对于处理Ajax请求,哪一个(承诺或Observable)在代码组织,惯例和性能方面最好?

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

+0

对于一次性请求/响应使用承诺。但是如果你想要一个数据流,就像你需要定期调用api一样使用RxObservable。 –

+1

最根本的区别并不涉及代码组织。承诺的问题是它们不能被取消。例如,如果您启动HTTP请求并接受承诺,那么您就无法取消该请求 - 这将会发生并且将会收到响应。在可观察的情况下,取消订阅可以取消正在进行的请求。 – cartant

我是否错过了这里的一些内容,因为我认为Rx Observable更加标准和高效地处理异步请求。

不,你不会错过任何东西。 Rx非常有用,但在特定情况下,基于承诺的代码更简单。

一般来说,如果您需要一个奇异值 - 更愿意承诺。如果你需要输入/输出多个值 - 使用observables(或spec中的异步迭代器)。

,如果你想快速地需要添加的Rx将是很好:

  • 重试的要求,如果他们失败了(与Observable.defer)。
  • 只关心最后的请求。
  • 如果您需要内置取消。

值得一提 - 如果您使用库,承诺可以完成所有工作。这不是观测值的基本属性。

如果您的输入不止一次致电,Rx真的会闪耀。如果您需要在用户点击某些内容时拨打这些电话,请忽略某些情况下的点击,将其删除至100ms,然后只关注最后一次电话 - 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