并行触发异步请求,但使用rxjs按顺序获取结果

Che*_*hef 5 javascript rxjs

例如:

使用jquery ajax在parrallel中获取5页。当page2返回时,什么也不做。当page1返回时,对page1和page2进行操作。

// assume there is some operator that can do this, 
// then it might look like this?
Rx.Observable.range(1, 5).
someOperator(function(page) {
  return Rx.Observable.defer( () => $.get(page) );
}).scan(function(preVal, curItem) {
  preVal.push(curItem);
  return preVal;
}, []);
Run Code Online (Sandbox Code Playgroud)

use*_*222 3

存在会forkJoin执行此操作的运算符run all observable sequences in parallel and collect their last elements.(从文档中引用)。但如果你使用那个,你将不得不等待所有 5 个承诺解决,或者 5 个承诺之一出错。RSVP.all它与or非常接近jQuery.when。所以一旦你有了第二个,你就不能再做任何事情了。无论如何,我都会提到它,以防它在其他情况下对您有用。

另一种可能性是使用它concatMap,这将使您能够按顺序接收已解决的承诺。但是,我不清楚它们是否会并行启动,第二个承诺只有在第一个承诺解决后才开始。

我能想到的最后一个选择是使用merge(2),它应该并行运行两个承诺,并且在任何时候它们都只会“启动”两个承诺。

现在,如果您不使用defer,而使用concatMap,我相信您应该启动所有 AJAX 请求,并且仍然正确排序。所以你可以写:

.concatMap(function(page) {
  return $.get(page);
})
Run Code Online (Sandbox Code Playgroud)

相关文档: