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

时间:2019-04-02 10:08:37

标签: callback rxjs deprecated tslint subscribe

当我运行棉短绒时,它说:

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

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

谢谢!

7 个答案:

答案 0 :(得分:48)

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

VSCode status bar

TypeScript version selector

Select local TypeScript version

从这个 GitHub comment 得到帮助。

<块引用>

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

答案 1 :(得分:14)

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

因此,您应该使用:

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

查看以下GitHub问题:

答案 2 :(得分:2)

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

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

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

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

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

答案 3 :(得分:2)

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

我遵循了这些步骤。 (我还建议在每一步结束时提交更改)

  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 中卸载 TSLint 插件,安装 ESLint 插件并重新加载 VSCode。

  6. 确保它更新了包和包锁文件。还有你项目中的 node_modules。

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

    {
      "eslint.workingDirectories": [
        "sub-directory-where-tsconfig-files-are"
      ]
    }
    
  • Angular 从 TSLint 迁移到 ESLint Reference

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:1)

你应该用 eslint 替换 tslint。

由于 TSLint 已被弃用,它不支持 RXJS 的 QX11Info 语法。 ESLint 是正确使用的 linter,用于正确订阅 linting。

答案 6 :(得分:0)

如果您的对象可以表示两种不同的类型Observable<T> | Observable<T2>,则会出现此错误。

例如:

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

以下内容将为您显示错误Use an observer instead of a complete callbackExpected 2-3 arguments, but got 1.

,这可能会让您感到惊讶
obs.subscribe(value => {

});

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

您需要更改代码以返回Observable<number | string>而不是Observable<number> | Observable<string>。细微之处取决于您在做什么。