RxJS 5任务队列,如果任务失败则继续

RxJS 5任务队列,如果任务失败则继续

问题描述:

想象一下,我们有一个触发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()蠢事或可能是整个方法是完全错误的。

任何帮助,非常感谢。

如果你读的onErrorResumeNext文档,

继续是正常或由 例外下一个观察的序列或承诺终止可观察序列。

这意味着当您的源observable遇到错误时,它将切换到您传递给onErrorResumeNext的任何内容。这里发生的是Rx.of(...)在发布它的值后立即终止。因此你观察到的行为。

所以总之,你不想在这里onErrorResumeNext

您可以改为.catch(...)可能发出错误的流。所以,像这样的:

subject 
    .concatMap(obs => obs.catch(Rx.Observable.of('error'))) 
    .subscribe(...) 
+1

谢谢!!!它像一个魅力。现在所有这些错误处理更有意义。 –

+1

很高兴听到。那么你应该花时间接受一个答案,如果它适合你的话,并且如果它有用的话就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

观察对象中的错误的想法与常规函数中的一样。意思是如果你在普通函数中抛出一个错误 - 函数不会返回任何东西。观察对象也是如此 - 如果observable发出错误,那意味着流完成并且没有更多的值来临。所以是的,这是根本错误的。

更好的(正确)方法是获得响应流,其中下一个值可以是成功响应或错误响应。如果您需要将它们分开,您可以在稍后将响应流分成两个成功/错误响应。

希望有所帮助。

+1

感谢您的帮助。我在想这是一个坏主意,但我想知道社区有什么要说的。 –