处理ajax请求 - Promise vs RxJs observable - rxjs运算符首选项

时间:2017-08-10 05:43:26

标签: javascript ajax promise rxjs5

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

sqrt(x)

但是,如你所知,它也可以在不使用Observables的情况下完成,只有承诺:

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

这两个代码都有效,但在我看来,使用promises的代码更干净。

我在这里遗漏了一些东西,因为我很遗憾Rx Observable处理异步请求更加标准和高效。

在处理ajax请求的代码组织,约定和性能方面哪一个(promise或Observable)最好?

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

1 个答案:

答案 0 :(得分:2)

  

我在这里遗漏了一些东西,因为我很遗憾Rx Observable处理异步请求更加标准和高效。

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

一般来说,如果你需要一个单一的价值 - 更喜欢承诺。如果你需要多个值in / out - 使用observables(或者在spec async迭代器中更进一步)。

如果您想快速添加,Rx会很好:

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

值得一提的是 - 如果您使用图书馆,承诺可以做到这一切。它不是可观察物的基本属性。

如果您的输入不仅仅是一个电话,Rx真的会发光。如果您需要在用户点击某些内容时进行这些调用,请忽略某些条件下的点击,将其去抖至100毫秒,然后只关心最后一个调用 - Rx将非常有用。

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

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