Javascript 处理ajax请求-Promise vs RxJs observable-RxJs操作员首选项
我使用Rxjs Observables处理嵌套ajax请求,如下所示: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
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)
- 只关心最后一个请求
- 如果您需要内置取消
$.getJSON('list1.json').then(x => $.getJSON(x.fileName || 'list2.json'))
我是否遗漏了一些东西,因为我一直认为Rx Observable在处理异步请求方面更标准、更高效
不,你没有遗漏任何东西。Rx确实很有用,但在特定情况下,基于承诺的代码更简单
通常,如果需要单数值,请选择承诺。如果需要输入/输出多个值,请使用Observable(或更高级的spec异步迭代器)
如果您想快速添加以下内容,Rx将非常好:
- 如果请求失败,则重试请求(使用Observable.defer)
- 只关心最后一个请求
- 如果您需要内置取消
$.getJSON('list1.json').then(x => $.getJSON(x.fileName || 'list2.json'))
在网络上有几篇非常好的文章,这里有几篇,我希望这些能帮助你正确理解它们之间的区别
在网络上有几篇非常好的文章,这里有几篇,我希望这些能帮助你正确理解它们之间的区别
对于一次性请求/响应,请使用承诺。但是如果你想要一个数据流,比如你需要在固定的时间间隔调用一个api,那么就使用RxObservable。最根本的区别根本与代码组织无关。承诺的问题在于它们是不可撤销的。例如,如果您启动一个HTTP请求并收到一个承诺,那么您无法取消该请求——请求将被发出,响应将被接收。在可观察的情况下,取消订阅可以取消飞行中的请求。对于一次性请求/响应,请使用承诺。但是如果你想要一个数据流,比如你需要在固定的时间间隔调用一个api,那么就使用RxObservable。最根本的区别根本与代码组织无关。承诺的问题在于它们是不可撤销的。例如,如果您启动一个HTTP请求并收到一个承诺,那么您无法取消该请求——请求将被发出,响应将被接收。对于可观察的,取消订阅可以取消飞行中的请求。