Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 处理ajax请求-Promise vs RxJs observable-RxJs操作员首选项_Javascript_Ajax_Promise_Rxjs5 - Fatal编程技术网

Javascript 处理ajax请求-Promise vs RxJs observable-RxJs操作员首选项

Javascript 处理ajax请求-Promise vs RxJs observable-RxJs操作员首选项,javascript,ajax,promise,rxjs5,Javascript,Ajax,Promise,Rxjs5,我使用Rxjs Observables处理嵌套ajax请求,如下所示: Rx.Observable.fromPromise($.getJSON('list1.json')) .switchMap(function responseA(aResponse){ /* processing aResponse*/ if(aResponse.fileName){ return Rx.Observable.fromPromise($.getJSON(a

我使用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 */
   });
但是,正如你所知,它也可以不使用可观测数据,只需要承诺:

   $.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,那么在这种情况下,哪些操作符(switchMap/MergeMap)更可取

我是否遗漏了一些东西,因为我一直认为Rx Observable在处理异步请求方面更标准、更高效

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

通常,如果需要单数值,请选择承诺。如果需要输入/输出多个值,请使用Observable(或更高级的spec异步迭代器)

如果您想快速添加以下内容,Rx将非常好:

  • 如果请求失败,则重试请求(使用Observable.defer)
  • 只关心最后一个请求
  • 如果您需要内置取消
值得一提的是,如果你使用图书馆,承诺可以做到这一切。这不是可观测的基本属性

如果你的输入不仅仅是一个电话,Rx真的会发光。如果你需要在用户点击某个东西时拨打这些电话,忽略某些条件下的点击,将其减至100ms,然后只关心最后一次呼叫-Rx将非常有用

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

$.getJSON('list1.json').then(x => $.getJSON(x.fileName || 'list2.json'))
我是否遗漏了一些东西,因为我一直认为Rx Observable在处理异步请求方面更标准、更高效

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

通常,如果需要单数值,请选择承诺。如果需要输入/输出多个值,请使用Observable(或更高级的spec异步迭代器)

如果您想快速添加以下内容,Rx将非常好:

  • 如果请求失败,则重试请求(使用Observable.defer)
  • 只关心最后一个请求
  • 如果您需要内置取消
值得一提的是,如果你使用图书馆,承诺可以做到这一切。这不是可观测的基本属性

如果你的输入不仅仅是一个电话,Rx真的会发光。如果你需要在用户点击某个东西时拨打这些电话,忽略某些条件下的点击,将其减至100ms,然后只关心最后一次呼叫-Rx将非常有用

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

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

在网络上有几篇非常好的文章,这里有几篇,我希望这些能帮助你正确理解它们之间的区别


  • 在网络上有几篇非常好的文章,这里有几篇,我希望这些能帮助你正确理解它们之间的区别


  • 对于一次性请求/响应,请使用承诺。但是如果你想要一个数据流,比如你需要在固定的时间间隔调用一个api,那么就使用RxObservable。最根本的区别根本与代码组织无关。承诺的问题在于它们是不可撤销的。例如,如果您启动一个HTTP请求并收到一个承诺,那么您无法取消该请求——请求将被发出,响应将被接收。在可观察的情况下,取消订阅可以取消飞行中的请求。对于一次性请求/响应,请使用承诺。但是如果你想要一个数据流,比如你需要在固定的时间间隔调用一个api,那么就使用RxObservable。最根本的区别根本与代码组织无关。承诺的问题在于它们是不可撤销的。例如,如果您启动一个HTTP请求并收到一个承诺,那么您无法取消该请求——请求将被发出,响应将被接收。对于可观察的,取消订阅可以取消飞行中的请求。