1

这与我遇到的错误无关,而是语法问题。

工作流程很简单:

  • 发出返回布尔值的 HTTP 请求
  • 如果布尔值为真,则继续
  • 如果布尔值为 false,则记录警告并停止流。

为了管理它,我当前的代码是这样的:

样板

private _getBoolean() { return this.http.get(...); }
private _getData() { return this.http.get(...); }

当前代码

public getData() {
  return this._getBoolean().pipe(
    filter(bool => {
      if(!bool) {
        console.warn('Wrong server answer, stream stopped');
        return false;
      }
      return true;
    }),
    switchMap(bool => this._getData())
  );
}

我不知道为什么,但它对我来说并不自然和优化。

我认为会有一些东西可以简化语法,就像这样

public getData() {
  return this._getBoolean().pipe(
    throwError(bool => bool ? new Error('Wrong server answer, stream stopped') : null),
    catchError(err => console.warn(err)),
    switchMap(bool => this._getData())
  );
}

有没有类似的东西,或者我有正确的语法?

4

3 回答 3

1

代替:

public getData() {
  return this._getBoolean().pipe(
    throwError(bool => bool ? new Error('Wrong server answer, stream stopped') : null),
    catchError(err => console.warn(err)),
    switchMap(bool => this._getData())
  );
}

为什么不这样:

public getData() {
  return this._getBoolean().pipe(
    tap(result => !result && throwError('Wrong server answer, stream stopped')),
    switchMap(bool => this._getData()),
    catchError(err => console.warn(err))
  );
}
于 2018-11-09T16:27:39.900 回答
1

考虑下面的 observable 发出值 1 到 4。假设当值为 3 时抛出错误。该错误可以在catchError运算符中捕获,也可以在subscribe. 我相信这取决于具体的用例,是让错误一直冒泡到订阅者,还是应该在订阅者上游的某个地方处理它。

of(1, 2, 3, 4).pipe(
  // Throw error when value is 3
  tap(value => { if(value === 3) throw new Error('Oops!') }),
  catchError(err => {
    console.log('Catch error in operator', err);

    // You can rethrow the same error or a new error
    // return throwError(err);

    // Or you can handle the error and return a new observable
    return of(3)
  })
).subscribe(
  value => console.log(value),
  // If `catchError` returns a new observable, then the error 
  // function here will not be called
  err => console.log('Catch error within subscribe', err),
  () => console.log('Done!')
)

请注意,在此示例中,即使正在处理错误,observable 也会完成并且永远不会发出值 4。如果您希望在遇到 en 错误时保持 observable 活动,请查看此 StackOverflow 答案

于 2018-11-09T13:54:45.137 回答
0

我不确定我是否正确地解决了您的问题,但您可以更换

    console.warn('Wrong server answer, stream stopped');
    return false;

   Observable.throw('Some error cause')

然后用流中最近的catch块捕获它,这使您基本上可以更改为: - 如果重新抛出错误则停止流 - 如果返回输入 observable 则重新启动它 - 返回全新的 observable

public getData() {
  return this._getBoolean().pipe(
    filter(bool => {
      if(!bool) {
        console.warn('Wrong server answer, stream stopped');
        //return false;
        Observable.throw('I got false where I expected true')
      }
      return true;
    }),
    switchMap(bool => this._getData())
  );
}

接着:

getData()
.any()
.operator()
.you()
.wish()
.catch(e => {
  /* Here stream will be terminated on thrown error */
})
于 2018-11-09T12:21:22.490 回答