当我运行棉短绒时,它说:
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)
);
完全不知道我应该使用什么以及如何使用...
谢谢!
答案 0 :(得分:48)
对我来说,这只是我的 VSCode 指向的打字稿版本。
从这个 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
,现在它不再显示警告!
我遵循了这些步骤。 (我还建议在每一步结束时提交更改)
添加eslint:
ng add @angular-eslint/schematics
将 tslint 转换为 eslint:
ng g @angular-eslint/schematics:convert-tslint-to-eslint
删除 tslint
和 codelyzer
:npm uninstall -S tslint codelyzer
如果您想自动修复许多 Lint 问题
ng lint --fix
(它还会列出未修复的问题)
在 VSCode 中卸载 TSLint
插件,安装 ESLint
插件并重新加载 VSCode。
确保它更新了包和包锁文件。还有你项目中的 node_modules。
如果您在子目录下有 tsconfig.json
文件 - 您需要使用 projects-root-directory/.vscode/settings.json
文件所在的子目录添加/更新 tsconfig
!
{
"eslint.workingDirectories": [
"sub-directory-where-tsconfig-files-are"
]
}
答案 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 callback
和Expected 2-3 arguments, but got 1.
obs.subscribe(value => {
});
这是因为它可以是两种不同类型中的一种,并且编译器不够聪明,无法协调它们。
您需要更改代码以返回Observable<number | string>
而不是Observable<number> | Observable<string>
。细微之处取决于您在做什么。