我正在使用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)会更好?
答案 0 :(得分:2)
我在这里遗漏了一些东西,因为我很遗憾Rx Observable处理异步请求更加标准和高效。
不,你没有遗漏任何东西。 Rx非常有用,但在特定情况下,基于promise的代码更简单。
一般来说,如果你需要一个单一的价值 - 更喜欢承诺。如果你需要多个值in / out - 使用observables(或者在spec async迭代器中更进一步)。
如果您想快速添加,Rx会很好:
值得一提的是 - 如果您使用图书馆,承诺可以做到这一切。它不是可观察物的基本属性。
如果您的输入不仅仅是一个电话,Rx真的会发光。如果您需要在用户点击某些内容时进行这些调用,请忽略某些条件下的点击,将其去抖至100毫秒,然后只关心最后一个调用 - Rx将非常有用。
在这种特殊情况下 - 承诺更简单,更好。您的承诺代码可以进一步简化:
$.getJSON('list1.json').then(x => $.getJSON(x.fileName || 'list2.json'))