处理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)会更可取?
答
我是否错过了这里的一些内容,因为我认为Rx Observable更加标准和高效地处理异步请求。
不,你不会错过任何东西。 Rx非常有用,但在特定情况下,基于承诺的代码更简单。
一般来说,如果您需要一个奇异值 - 更愿意承诺。如果你需要输入/输出多个值 - 使用observables(或spec中的异步迭代器)。
,如果你想快速地需要添加的Rx将是很好:
- 重试的要求,如果他们失败了(与Observable.defer)。
- 只关心最后的请求。
- 如果您需要内置取消。
值得一提 - 如果您使用库,承诺可以完成所有工作。这不是观测值的基本属性。
如果您的输入不止一次致电,Rx真的会闪耀。如果您需要在用户点击某些内容时拨打这些电话,请忽略某些情况下的点击,将其删除至100ms,然后只关注最后一次电话 - Rx将非常有用。
在这种特殊情况下 - 承诺更简单,更好。你承诺的代码可以进一步简化:
$.getJSON('list1.json').then(x => $.getJSON(x.fileName || 'list2.json'))
答
有几个真正的好文章的网站在那里,这里是他们夫妇的,我希望这些会帮助你正确理解上的差异。
对于一次性请求/响应使用承诺。但是如果你想要一个数据流,就像你需要定期调用api一样使用RxObservable。 –
最根本的区别并不涉及代码组织。承诺的问题是它们不能被取消。例如,如果您启动HTTP请求并接受承诺,那么您就无法取消该请求 - 这将会发生并且将会收到响应。在可观察的情况下,取消订阅可以取消正在进行的请求。 – cartant