Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript RxJS 5任务队列,任务失败时继续_Javascript_Ajax_Rxjs_Rxjs5_Reactive Extensions Js - Fatal编程技术网

Javascript RxJS 5任务队列,任务失败时继续

Javascript 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

假设我们有一个触发AJAX请求的HTML页面。我们希望确保AJAX请求按顺序执行。在前一个AJAX请求完成或出现错误之前,不会触发下一个AJAX请求

我尝试使用RxJS
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(...)