当我打开缰绳时,上面写着:

subscribe is deprecated: Use an observer instead of an error callback

angular应用的代码:

    this.userService.updateUser(data).pipe(
       tap(() => {bla bla bla})
    ).subscribe(
       this.handleUpdateResponse.bind(this),
       this.handleError.bind(this)
    );

我不知道该用什么,怎么用……

谢谢!


当前回答

也许有趣的是,观察者对象也可以(仍然)包含complete()方法和其他附加属性。例子:

.subscribe({
    complete: () => { ... }, // completeHandler
    error: () => { ... },    // errorHandler 
    next: () => { ... },     // nextHandler
    someOtherProperty: 42
});

这样可以更容易地省略某些方法。对于旧的签名,必须提供未定义的并坚持参数的顺序。现在,只提供下一个完整的处理程序就清楚多了。

其他回答

也许有趣的是,观察者对象也可以(仍然)包含complete()方法和其他附加属性。例子:

.subscribe({
    complete: () => { ... }, // completeHandler
    error: () => { ... },    // errorHandler 
    next: () => { ... },     // nextHandler
    someOtherProperty: 42
});

这样可以更容易地省略某些方法。对于旧的签名,必须提供未定义的并坚持参数的顺序。现在,只提供下一个完整的处理程序就清楚多了。

如果你有一个对象类型为Observable<T> | Observable<T2> -而不是Observable<T|T2>,你就会得到这个错误。

例如:

    const obs = (new Date().getTime() % 2 == 0) ? of(123) : of('ABC');

编译器不会将类型为Observable<number |的obs设为字符串>。

它可能会让你惊讶,下面会给你错误使用一个观察者而不是一个完整的回调和期望2-3个参数,但得到1。

obs.subscribe(value => {

});

这是因为它可以是两种不同类型中的一种,而编译器不够聪明,无法协调它们。

你需要改变你的代码返回Observable<number | string>而不是Observable<number> | Observable<string>。这其中的微妙之处取决于你在做什么。

对我来说,这只是我的VSCode指向的typescript版本。

从这个GitHub评论中得到了帮助。

我相信这是打字稿的问题。在最新版本的typescript中,某些东西导致这个警告显示在vs code中。我可以通过点击vs code右下角的typescript版本,然后选择select typescript版本选项来让它消失。我将它设置为我们在angular项目中安装的node_modules版本,在我们的例子中恰好是4.0.7。这使得警告消失了。

我得到这个警告是因为我正在传递这个来订阅:

myObs.subscribe(() => someFunction());

由于它返回单个值,因此与订阅的函数签名不兼容。

切换到这个使警告消失(返回null/void);

myObs.subscribe(() => {
  someFunction();
});

订阅不被弃用,只是您使用的变体被弃用。以后,subscribe将只接受一个参数:要么是下一个处理程序(函数),要么是一个观察者对象。

所以在你的情况下,你应该使用:

.subscribe({
   next: this.handleUpdateResponse.bind(this),
   error: this.handleError.bind(this)
});

请看这些GitHub问题:

https://github.com/ReactiveX/rxjs/pull/4202 https://github.com/ReactiveX/rxjs/issues/4159