Javascript RxJS 5任务队列,任务失败时继续
假设我们有一个触发AJAX请求的HTML页面。我们希望确保AJAX请求按顺序执行。在前一个AJAX请求完成或出现错误之前,不会触发下一个AJAX请求 我尝试使用RxJSJavascript RxJS 5任务队列,任务失败时继续,javascript,ajax,rxjs,rxjs5,reactive-extensions-js,Javascript,Ajax,Rxjs,Rxjs5,Reactive Extensions Js,假设我们有一个触发AJAX请求的HTML页面。我们希望确保AJAX请求按顺序执行。在前一个AJAX请求完成或出现错误之前,不会触发下一个AJAX请求 我尝试使用RxJSconcatMap通过任务队列对此进行建模。每个AJAX请求都被建模为一个可观察的。如果AJAX请求成功完成,那么一切都很正常,但是如果它出错,那么队列中的下一个任务就不会执行 下面是一个使用setTimeout()模拟长时间运行的异步任务的示例: 以下是一个可执行示例: 当我运行此代码时,控制台会打印以下内容: onNext
concatMap
通过任务队列对此进行建模。每个AJAX请求都被建模为一个可观察的
。如果AJAX请求成功完成,那么一切都很正常,但是如果它出错,那么队列中的下一个任务就不会执行
下面是一个使用setTimeout()
模拟长时间运行的异步任务的示例:
以下是一个可执行示例:
当我运行此代码时,控制台会打印以下内容:
onNext 11
onNext 22
onNext错误
这是意料之中的,但我想知道为什么像44、55等其他任务没有执行
我很确定我在用onerrorrumesumenext()
做一些愚蠢的事情,或者可能是整个方法完全错了
非常感谢您的帮助。观测值中的误差与常规函数中的误差是一样的。这意味着,如果在常规函数中抛出错误,函数将不会返回任何内容。可观测数据也是如此——如果可观测数据发出一个错误,这意味着流已经完成,并且没有更多的值出现。因此,是的,这是根本错误的 更好的(正确的)方法是有一个响应流,其中下一个值可以是成功响应或错误响应。如果需要将它们分开,您可以稍后将响应流拆分为两个成功/错误响应
希望对您有所帮助。如果您阅读了
OneRorResumeNext
的文档
继续一个可观察序列,该序列正常终止或由
下一个可观察序列或承诺的例外
这意味着,当您的源observable遇到错误时,它将切换到您传递给onErrorResumeNext
的任何内容。这里发生的是,Rx.of(…)
在发出其值后立即终止。因此你观察到的行为
因此,简而言之,您不希望在这里看到onErrorResumeNext
您可以改为.catch(…)
可能发出错误的流。比如说:
subject
.concatMap(obs => obs.catch(Rx.Observable.of('error')))
.subscribe(...)
谢谢你的帮助。我认为这是个坏主意,但我想知道社区有什么要说的。很高兴听到。然后,如果答案对你有用,你应该花时间接受它,如果有用,就投票表决。这对这个答案是有效的,但对这个答案也是有效的,还有这个:
subject
.concatMap(obs => obs.catch(Rx.Observable.of('error')))
.subscribe(...)