提问人:ismaestro 提问时间:4/2/2019 最后编辑:ismaestro 更新时间:8/30/2023 访问量:257139
Subscribe 已弃用:使用观察器而不是错误回调
Subscribe is deprecated: Use an observer instead of an error callback
问:
当我运行 linter 时,它说:
subscribe is deprecated: Use an observer instead of an error callback
this.userService.updateUser(data).pipe(
tap(() => {bla bla bla})
).subscribe(
this.handleUpdateResponse.bind(this),
this.handleError.bind(this)
);
不知道我应该使用什么以及如何使用......
谢谢!
答:
subscribe
未弃用,只有您正在使用的变体被弃用。将来,将只接受一个参数:处理程序(函数)或观察者对象。subscribe
next
因此,在您的情况下,您应该使用:
.subscribe({
next: this.handleUpdateResponse.bind(this),
error: this.handleError.bind(this)
});
请参阅以下 GitHub 问题:
评论
subscribe()
如果将对象键入为 - 而不是 ,则可能会收到此错误。Observable<T> | Observable<T2>
Observable<T|T2>
例如:
const obs = (new Date().getTime() % 2 == 0) ? of(123) : of('ABC');
编译器不生成类型。obs
Observable<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>
评论
有趣的是,Object 还可以(仍然)包含方法和其他附加属性。例:observer
complete()
.subscribe({
complete: () => { ... }, // completeHandler
error: () => { ... }, // errorHandler
next: () => { ... }, // nextHandler
someOtherProperty: 42
});
这样,省略某些方法要容易得多。使用旧签名,有必要提供并遵守参数的顺序。现在,例如,当仅提供下一个和完整的处理程序时,情况就清楚多了。undefined
评论
real this
real this
let scopedThis = this
bind()
observer
subscribe()
undefined
next()
error()
我收到警告是因为我正在传递这个来订阅:
myObs.subscribe(() => someFunction());
由于它返回单个值,因此它与 的函数签名不兼容。subscribe
切换到此值会使警告消失(返回 null/void);
myObs.subscribe(() => {
someFunction();
});
对我来说,这只是我的 VSCode 指向的打字稿版本。
从此 GitHub 评论中获得了帮助。
我相信这是一个打字稿问题。最新版本的打字稿中的某些内容导致此警告显示在 vs code 中。我能够通过单击 vs code 右下角的打字稿版本,然后选择选择打字稿版本选项来让它消失。我将其设置为我们在 angular 项目中安装的node_modules版本,在我们的例子中恰好是 4.0.7。这导致警告消失。
您应该将 tslint 替换为 eslint。
由于 TSLint 已被弃用,因此它不支持 RXJS 的语法。ESLint 是正确的 linter 使用,可以正确地进行订阅 linting。@deprecated
评论
我将我的项目从 迁移到 ,它现在不再显示警告!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 中卸载插件,安装插件并重新加载 VSCode。
TSLint
ESLint
确保它更新了包和包锁定文件。也是项目中node_modules。
如果您在子目录下有文件 - 您需要添加/更新文件所在的子目录!
tsconfig.json
projects-root-directory/.vscode/settings.json
tsconfig
{ "eslint.workingDirectories": [ "sub-directory-where-tsconfig-files-are" ] }
- VS Code 官方页面上的信息:从 TSLint 迁移到 ESLint(感谢您在评论中指出这一点!
- 从 TSLint 到 ESLint 参考的 Angular 迁移
评论
有关详细信息,请访问官方网站 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')
})
使用 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: () => { }
}
);
subscribe 的新语法:
this.fetch().subscribe({
next: (account: Account) => {
console.log(account);
console.log("Your code ...");
},
error: (e) => {
console.error(e);
},
complete() {
console.log("is completed");
},
});
评论
.subscribe({ next: this.handleUpdateResponse.bind(this), error: this.handleError.bind(this) })