Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.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
Angular 如何在Rxjs中创建条件轮询运算符_Angular_Rxjs - Fatal编程技术网

Angular 如何在Rxjs中创建条件轮询运算符

Angular 如何在Rxjs中创建条件轮询运算符,angular,rxjs,Angular,Rxjs,我需要使用Rxjs创建一个轮询操作符,它不使用时间源(例如计时器或间隔)。这将用于轮询与返回值所需时间极不一致的第三方api。我只想在返回的值为空时再次轮询 到目前为止我试过的是 this.someService.getStoredValue()管道( repeatWhen(newPoll=>newPoll.pipe(//将每次重新提交延迟两秒 延迟(2000年) )), pull('Data),//只对返回对象的数据属性感兴趣 过滤器(isNotNull=>isNotNull!=''), 超时

我需要使用Rxjs创建一个轮询操作符,它不使用时间源(例如计时器或间隔)。这将用于轮询与返回值所需时间极不一致的第三方api。我只想在返回的值为空时再次轮询

到目前为止我试过的是

this.someService.getStoredValue()管道(
repeatWhen(newPoll=>newPoll.pipe(//将每次重新提交延迟两秒
延迟(2000年)
)),
pull('Data),//只对返回对象的数据属性感兴趣
过滤器(isNotNull=>isNotNull!=''),
超时(20000),//如果20秒后没有成功的轮询尝试,则抛出错误
).订阅({
下一步:值=>{
//仅当轮询成功时
},
错误:err=>{
//如果无法访问api,或者出现超时,我想在这里结束。
},
complete:()=>console.log('completed')
})
我希望操作符的输出尝试轮询,例如10次。如果返回对象的Data属性具有非空值,请取消订阅轮询服务。如果尝试了10次,取消订阅并发出错误


但是,如果轮询从未成功,订阅将无限期进行。

我肯定会推荐takeWhileInclusive运营商,可在此处下载:


只要把你的状态作为一个函数传递,加上你的间隔时间,它就会起作用

我绝对推荐takeWhileInclusive运营商,可在此处下载:


只要把你的状态作为一个函数传递,加上你的间隔时间,它就会起作用

这看起来像是一个
重试
案例,其中一个陷阱是空答案应该被视为错误。比如:

this.someService.getStoredValue().pipe(
    pluck('Data'),
    flatMap(value => !!value ? of(value) : throwError("Empty!")),
    retry(10),
)

这看起来像是一个
重试
案例,其中一个陷阱是空答案应该被视为错误。比如:

this.someService.getStoredValue().pipe(
    pluck('Data'),
    flatMap(value => !!value ? of(value) : throwError("Empty!")),
    retry(10),
)

也许你想要。它使用计时器,但我不知道你为什么要求不包括它。我绝对建议rxjs在包含时使用:
interval(1000)。pipe(takeWhileInclusive(v=>v@AndrewAllen Hi,一定会检查出来。我不想依赖计时器的原因是,如果第三方api需要一秒钟以上的时间才能回复。这将导致我的轮询函数在第三方仍在制定有效回复时再次轮询。@Anders在这种情况下,链接不太相关-它更像about在失败时重试的时间。我可能会使用mbojko应答(可能使用链接的
retryWhen(generalRetryStrategy())
来添加失败时的延迟)。它使用计时器,但我不确定您为什么要求不包含此项。我肯定会建议rxjs在包含此项时使用:
interval(1000)。管道(包括在内)(v=>v@AndrewAllen Hi,一定会检查出来。我不想依赖计时器的原因是,如果第三方api需要一秒钟以上的时间才能回复。这将导致我的轮询函数在第三方仍在制定有效回复时再次轮询。@Anders在这种情况下,链接不太相关-它更像about失败时重试的时间。我将使用mbojko应答(可能与链接的
retryWhen(generalRetryStrategy())
一起添加失败时的延迟)如果你想在每次重新提交之间增加一个延迟,你会怎么做?因此,当你从第三方获得一个空值后,你会将下一次投票请求延迟1秒。我尝试添加
delay(2000)
在TrowerRor操作符上,但没有效果。查看此线程:如果您想在每次重新提交之间添加延迟,您将如何执行?因此,在从第三方获得空值后,您将延迟下一次轮询请求1秒。我尝试添加
延迟(2000)
,但无效。请查看以下线程: