Subscribe 已弃用:使用观察器而不是错误回调

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

提问人:ismaestro 提问时间:4/2/2019 最后编辑:ismaestro 更新时间:8/30/2023 访问量:257139

问:

当我运行 linter 时,它说:

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)
    );

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

谢谢!

回调 rxjs 已弃用 tslint subscribe

评论

9赞 kos 4/2/2019
* 所以尝试使用.subscribe({ next: this.handleUpdateResponse.bind(this), error: this.handleError.bind(this) })
0赞 Javier 7/22/2019
我无法使用我的apiRest使它工作
6赞 Mohd Jawwad Hussain 2/26/2021
详细的答案可以在这里找到 jeffryhouser.com/index.cfm/2019/8/27/...

答:

465赞 martin 4/2/2019 #1

subscribe未弃用,只有您正在使用的变体被弃用。将来,将只接受一个参数:处理程序(函数)或观察者对象。subscribenext

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

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

请参阅以下 GitHub 问题:

评论

57赞 Yannic Hamann 11/19/2019
idk...在 VS Code 中悬停仍显示该语法已弃用 (RXJS 6.5.3)
22赞 Dean 2/10/2020
嘿,@YannicHamann这个评论解释了原因。它没有被弃用,他们只是弃用了其中一个重载,现在看起来一切都被弃用了。这主要是工具问题。
5赞 Alok Rajasukumaran 6/22/2020
我认为这个答案不再有效,因为所有订阅方法现在在 rxjs 6.5.4 中都被弃用
6赞 AsGoodAsItGets 3/5/2021
是否有迁移脚本可以自动更新我们所有的方法?我们的项目中有数百个,我无法想象必须手动执行此操作!subscribe()
6赞 Leonardo Rick 3/7/2021
@AlokRajasukumaran我们现在应该如何订阅?
23赞 Simon_Weaver 7/11/2019 #2

如果将对象键入为 - 而不是 ,则可能会收到此错误。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 callbackExpected 2-3 arguments, but got 1.

obs.subscribe(value => {

});

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

您需要更改代码以返回而不是 .这样做的微妙之处会根据您正在做的事情而有所不同。Observable<number | string>Observable<number> | Observable<string>

评论

0赞 Phil Huhn 1/19/2021
这对我有用,deleteNoteType( NoteTypeId: number ): Observable<HttpResponse<undefined> |HttpErrorResponse> { ... }
158赞 magikMaker 7/11/2019 #3

有趣的是,Object 还可以(仍然)包含方法和其他附加属性。例:observercomplete()

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

这样,省略某些方法要容易得多。使用旧签名,有必要提供并遵守参数的顺序。现在,例如,当仅提供下一个和完整的处理程序时,情况就清楚多了。undefined

评论

0赞 Sebi2020 1/10/2022
如果使用此表格,如何访问?real this
1赞 magikMaker 1/11/2022
不知道你说的是什么意思。总是可以使用变量,例如,或者你可以。real thislet scopedThis = thisbind()
0赞 Theta 6/25/2022
正是我想要的!将对象传递到中时,当您不想指定或回调时,无需显式键入为缺少的参数。observersubscribe()undefinednext()error()
2赞 inorganik 5/23/2020 #4

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

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

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

切换到此值会使警告消失(返回 null/void);

myObs.subscribe(() => {
  someFunction();
});
55赞 Paritosh 3/18/2021 #5

对我来说,这只是我的 VSCode 指向的打字稿版本。

VSCode status bar

TypeScript version selector

Select local TypeScript version

从此 GitHub 评论中获得了帮助。

我相信这是一个打字稿问题。最新版本的打字稿中的某些内容导致此警告显示在 vs code 中。我能够通过单击 vs code 右下角的打字稿版本,然后选择选择打字稿版本选项来让它消失。我将其设置为我们在 angular 项目中安装的node_modules版本,在我们的例子中恰好是 4.0.7。这导致警告消失。

1赞 Raslan N. Kiwan 4/4/2021 #6

您应该将 tslint 替换为 eslint。

由于 TSLint 已被弃用,因此它不支持 RXJS 的语法。ESLint 是正确的 linter 使用,可以正确地进行订阅 linting。@deprecated

评论

11赞 Remy 4/6/2021
我不认为这个解决方案是好的,因为忽略一个问题并不能解决它。
3赞 Rancid 4/29/2021
在这种情况下,这不是忽略问题的问题,因为似乎只是一个 TSLint 错误:stackoverflow.com/a/66605060/2445651......但更重要的是要知道 TSLint 已被弃用,取而代之的是 ESLint:stackoverflow.com/a/66933996/2445651
0赞 Caveman 7/10/2023
它不是忽略,而是删除了一个错误的错误。
4赞 Lahar Shah 5/6/2021 #7

我将我的项目从 迁移到 ,它现在不再显示警告!AngularTSLintESLint

我按照以下步骤操作。(每个步骤结束时,我还建议提交更改)

  1. 添加 eslint:ng add @angular-eslint/schematics

  2. 转换 tslint 到 eslint:ng g @angular-eslint/schematics:convert-tslint-to-eslint

  3. 删除和:tslintcodelyzernpm uninstall -S tslint codelyzer

  4. 如果您想自动修复许多 Lint 问题(它还将列出未修复的问题)ng lint --fix

  5. 在 VSCode 中卸载插件,安装插件并重新加载 VSCode。TSLintESLint

  6. 确保它更新了包和包锁定文件。也是项目中node_modules。

  7. 如果您在子目录下有文件 - 您需要添加/更新文件所在的子目录!tsconfig.jsonprojects-root-directory/.vscode/settings.jsontsconfig

    {
      "eslint.workingDirectories": [
        "sub-directory-where-tsconfig-files-are"
      ]
    }
    

评论

1赞 viking 2/10/2022
有关从 TSLint 迁移到 ESNint 的更多详细信息,请参见 VS Code 官方页面:code.visualstudio.com/api/advanced-topics/...
30赞 Gautam Pandey 2/13/2022 #8

有关详细信息,请访问官方网站 https://rxjs.dev/deprecations/subscribe-arguments

请注意下面第二个订阅代码中的大括号。{}

import { of } from 'rxjs';

// recommended 
of([1,2,3]).subscribe((v) => console.info(v));
// also recommended
of([1,2,3]).subscribe({
    next: (v) => console.log(v),
    error: (e) => console.error(e),
    complete: () => console.info('complete') 
})
17赞 Vikram Kumar 11/14/2022 #9

使用 RxJS 的新方法非常简单:

以前的版本:

this.activatedRoute.queryParams.subscribe(queryParams => {
console.log("queryParams, queryParams)

}, error => {
})

新版本:

  this.activatedRoute.queryParams.subscribe(
  {
    next: (queryParams) => {
      console.log('queryParams', queryParams);
    },

    error: (err: any) => { },
    complete: () => { }
  }
);
1赞 Mady 8/30/2023 #10

subscribe 的新语法:

 this.fetch().subscribe({
        next: (account: Account) => {
            console.log(account);
            console.log("Your code ...");
        },

        error: (e) => {
            console.error(e);
        },

        complete() {
          console.log("is completed");
        },
});

评论

0赞 Hari Krishnan Ramachandran 9/16/2023
完整回调的目的是什么?是不是有点类似于最后的承诺?