我怎样才能在捕获后重试?
我想在catch方法之后自动重试我的observable而不调用另一个subscribe。我怎么能这样做?
我现在有这样的事情:
function Invoke-Sql(
$ConnectionString,
$Query
) {
$conn = New-Object System.Data.OracleClient.OracleConnection($ConnectionString)
$cmd = New-Object System.Data.OracleClient.OracleCommand($Query,$conn)
$conn.Open()
$reader = $cmd.ExecuteReader()
if ($reader.Read()) {
[string[]]$columns = 0..($reader.FieldCount-1) |
% { if ($reader.GetName($_)) { $reader.GetName($_) } else { "(no name $_)" } }
do {
$obj = @{}
0..($reader.FieldCount-1) | % { $obj.Add($columns[$_], $reader[$_]) }
[PSCustomObject]$obj
} while ($reader.Read())
}
$reader.Dispose()
$cmd.Dispose()
$conn.Dispose()
}
所以,当我有我的observable并在其上调用intercept(observable: Observable<Response>): Observable<Response> {
return observable.catch((err, source) => {
return this.refreshToken()
.flatMap(res => {
if (res.status === 200) {
return observable;
}
return Observable.throw(new Error('Can\'t refresh the token'));
});
});
}
时,它将捕获错误subscribe
刷新令牌->
,然后返回observable,我必须调用另一个订阅。我不想这样做。我怎么能让它与之前的订阅一起工作?
调用示例将会显示如下内容:
->
答案 0 :(得分:3)
有几个操作符可以与catch一起使用来处理重试/重复。它们是有用的运算符,它们允许您有条件地重新订阅已终止的可观察对象。来自retryWhen
的官方文档:
在通知程序时重复出现错误的源可观察序列 发出下一个值。如果源可观察到的错误和通知程序 完成后,它将完成源序列。
此处的其他信息:
您可以在以前的问题中找到一些示例:
从第二个SO问题:
src.retryWhen(function (errors) {
// retry for some errors, end the stream with an error for others
return errors.do(function (e) {
if (!canRetry(e)) {
throw e;
}
});
});