不建议使用订阅:使用观察者而不是错误回调


103

当我运行lint时,它说:

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

代码(来自带有angular-cli的angular 7应用):

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

不确切地知道我应该使用什么以及如何使用...

谢谢!


1
*因此,请尝试使用.subscribe({ next: this.handleUpdateResponse.bind(this), error: this.handleError.bind(this) })
kos,

我无法使用apiRest使其正常工作
哈维尔(Javier),

Answers:


143

subscribe不被弃用,仅弃用您正在使用的变体。将来,subscribe将仅采用一个参数:next处理程序(函数)或观察者对象。

因此,在您的情况下,您应该使用:

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

请参阅以下GitHub问题:


6
idk ...悬停在vs代码中仍然显示不赞成使用该语法(rxjs 6.5.3)
Yannic Hamann,

6
嘿@YannicHamann,此评论说明了原因。它不被弃用,他们只是不赞成其中一个重载,现在看来一切都被弃用了。这主要是一个工具问题。
院长

我认为此答案不再有效,因为rxjs 6.5.4中已弃用所有订阅方法
Alok Rajasukumaran

44

可能有趣的是,observer对象还可以(仍然)包含complete()方法和其他附加属性。例:

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

这样,省略某些方法会容易得多。使用旧的签名,必须提供undefined并坚持论据的顺序。现在,例如仅提供下一个完整的处理程序时,情况就更加清楚了。


11

如果您将对象键入为Observable<T> | Observable<T2>-而不是,则会出现此错误Observable<T|T2>

例如:

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

编译器并没有做出obsObservable<number | string>

以下内容可能会给您带来错误,Use an observer instead of a complete callback并且Expected 2-3 arguments, but got 1.

obs.subscribe(value => {

});

这是因为它可以是两种不同类型中的一种,并且编译器不够智能,无法协调它们。

您需要更改代码以返回Observable<number | string>而不是Observable<number> | Observable<string>。其细微之处将根据您的操作而有所不同。


2

我收到警告是因为我通过了此订阅:

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

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

切换到此选项将使警告消失(返回null / void);

myObs.subscribe(() => {
  someFunction();
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.