想象一下,我們有一個觸發AJAX請求的HTML頁面。我們希望確保AJAX請求按順序執行。直到前一個AJAX請求完成或發生錯誤,下一個AJAX請求才會被觸發。RxJS 5任務隊列,如果任務失敗則繼續
我試圖通過使用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()
蠢事或可能是整個方法是完全錯誤的。
任何幫助,非常感謝。
謝謝!!!它像一個魅力。現在所有這些錯誤處理更有意義。 –
很高興聽到。那麼你應該花時間接受一個答案,如果它適合你的話,並且如果它有用的話就UPVOTE。這是有效的答案,但也爲這一個:http://stackoverflow.com/questions/32594357/rxjs-modeling-if-else-control-structures-with-observables-operators,和這一個:http:// stackoverflow.com/questions/36914801/javascript-new-date-gettime-with-timezone-offset-calculations-returns-9-999 – user3743222