处理 ajax 请求 - Promise 与 RxJs 可观察 - rxjs 运营商偏好
Handling ajax request - Promise vs RxJs observable - rxjs operator preferences
我正在使用 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 */
});
但是,如您所知,它也可以不使用 Observables 而只使用 promises 来完成:
$.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 */
});
两种代码都有效,但在我看来,使用 promises 在代码方面更简洁。
我是否遗漏了什么,因为我认为 Rx Observable 在处理异步请求方面更加标准和高效。
就处理 ajax 请求的代码组织、约定和性能而言,哪一个(promise 或 Observable)最好?
如果我更喜欢使用 Observable,那么在这种情况下哪种运算符 (switchMap/MergeMap) 更可取?
Am I missing something here as I've heart that Rx Observable is more standard and efficient to handle asynchronous requests.
不,你没有遗漏任何东西。 Rx 确实很有用,但在特定情况下,基于 promise 的代码更简单。
一般来说,如果您需要一个奇异值 - 更喜欢 promise。如果您需要多个值 in/out - 使用 observables(或更先进的规范异步迭代器)。
Rx 会很好,如果你想快速需要添加:
- 如果请求失败则重试请求(Observable.defer)。
- 只关心最后一个请求。
- 如果您需要内置取消功能。
值得一提的是 - 如果您使用库,promises 可以完成所有这些工作。它不是可观察量的基本 属性。
如果您的输入不止一次调用,Rx 真的很出色。如果您需要在用户点击某些东西时进行这些调用,忽略某些条件下的点击,将其去抖动到 100 毫秒,然后只关心最后一次调用 - Rx 将非常有用。
在这种特殊情况下 - 承诺更简单也更好。您的承诺代码可以进一步简化:
$.getJSON('list1.json').then(x => $.getJSON(x.fileName || 'list2.json'))
网络上有几篇非常好的文章,这里是其中的几篇,我希望它们能帮助您正确理解它们之间的区别。
我正在使用 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 */
});
但是,如您所知,它也可以不使用 Observables 而只使用 promises 来完成:
$.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 */
});
两种代码都有效,但在我看来,使用 promises 在代码方面更简洁。
我是否遗漏了什么,因为我认为 Rx Observable 在处理异步请求方面更加标准和高效。
就处理 ajax 请求的代码组织、约定和性能而言,哪一个(promise 或 Observable)最好?
如果我更喜欢使用 Observable,那么在这种情况下哪种运算符 (switchMap/MergeMap) 更可取?
Am I missing something here as I've heart that Rx Observable is more standard and efficient to handle asynchronous requests.
不,你没有遗漏任何东西。 Rx 确实很有用,但在特定情况下,基于 promise 的代码更简单。
一般来说,如果您需要一个奇异值 - 更喜欢 promise。如果您需要多个值 in/out - 使用 observables(或更先进的规范异步迭代器)。
Rx 会很好,如果你想快速需要添加:
- 如果请求失败则重试请求(Observable.defer)。
- 只关心最后一个请求。
- 如果您需要内置取消功能。
值得一提的是 - 如果您使用库,promises 可以完成所有这些工作。它不是可观察量的基本 属性。
如果您的输入不止一次调用,Rx 真的很出色。如果您需要在用户点击某些东西时进行这些调用,忽略某些条件下的点击,将其去抖动到 100 毫秒,然后只关心最后一次调用 - Rx 将非常有用。
在这种特殊情况下 - 承诺更简单也更好。您的承诺代码可以进一步简化:
$.getJSON('list1.json').then(x => $.getJSON(x.fileName || 'list2.json'))
网络上有几篇非常好的文章,这里是其中的几篇,我希望它们能帮助您正确理解它们之间的区别。