我怎样才能在捕获后重试?

时间:2016-09-14 08:27:14

标签: javascript angular rxjs

我怎样才能在捕获后重试?

我想在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,我必须调用另一个订阅。我不想这样做。我怎么能让它与之前的订阅一起工作?

调用示例将会显示如下内容:

->

1 个答案:

答案 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;
        }
    });
});