假设我们有一个触发 AJAX 请求的 HTML 页面。我们要确保 AJAX 请求按顺序执行。下一个 AJAX 请求在前一个完成或出错之前不会被触发。
我试图通过使用 RxJS 的任务队列对此进行建模concatMap
。每个 AJAX 请求都被建模为一个Observable
. 如果 AJAX 请求成功完成,一切正常,但是如果出错,则不会执行队列中的下一个任务。
这是一个示例,用于setTimeout()
模拟长时间运行的异步任务:
function identity(observable) {
return observable;
}
function createTaskQueue() {
var subject= new Rx.Subject();
subject
.concatMap(identity)
.onErrorResumeNext(Rx.Observable.of('error'))
.subscribe(function(data) {
console.log('onNext', data);
},
function(error) {
console.log('onError', error);
});
return {
addTask: function(task) {
subject.next(task);
}
}
}
function createTask(data, delay) {
return Rx.Observable.create(function(obs) {
setTimeout(function() {
obs.next(data);
obs.complete();
}, delay);
});
}
function createErrorTask(data, delay) {
return Rx.Observable.create(function(obs) {
setTimeout(function() {
obs.error('Error: ' + data);
obs.complete();
}, delay);
});
}
var taskQueue = createTaskQueue();
taskQueue.addTask(createTask(11, 500))
taskQueue.addTask(createTask(22, 200));
taskQueue.addTask(createErrorTask(33, 1000));
taskQueue.addTask(createTask(44, 300));
taskQueue.addTask(createErrorTask(55, 300));
taskQueue.addTask(createTask(66, 300));
这是一个可执行示例:https ://jsfiddle.net/artur_ciocanu/s6ftxwnf/ 。
当我运行此代码时,控制台会打印以下内容:
onNext 11
onNext 22
onNext error
这是意料之中的,但我想知道为什么其他任务(如 44、55 等)没有执行。
我很确定我在做一些愚蠢的事情,onErrorResumeNext()
或者整个方法可能是完全错误的。
很感谢任何形式的帮助。