Quando executo o linter, ele diz:
subscribe is deprecated: Use an observer instead of an error callback
Código (de um app angular 7 com angular-cli):
this.userService.updateUser(data).pipe(
tap(() => {bla bla bla})
).subscribe(
this.handleUpdateResponse.bind(this),
this.handleError.bind(this)
);
Não sei exatamente o que devo usar e como ...
Obrigado!
.subscribe({ next: this.handleUpdateResponse.bind(this), error: this.handleError.bind(this) })
Respostas:
subscribe
não está obsoleto, apenas a variante que você está usando está obsoleta. No futuro,subscribe
terá apenas um argumento: onext
manipulador (uma função) ou um objeto observador.Portanto, no seu caso, você deve usar:
Veja estes problemas do GitHub:
https://github.com/ReactiveX/rxjs/pull/4202
https://github.com/ReactiveX/rxjs/issues/4159
fonte
Talvez seja interessante notar que o
observer
Objeto também pode (ainda) conter ocomplete()
método e outras propriedades adicionais. Exemplo:Dessa forma, é muito mais fácil omitir certos métodos. Com a assinatura antiga era necessário fornecer
undefined
e manter a ordem dos argumentos. Agora é muito mais claro quando, por exemplo, fornecemos apenas um manipulador seguinte e completo.fonte
Você pode obter este erro se tiver um objeto digitado como
Observable<T> | Observable<T2>
- em vez deObservable<T|T2>
.Por exemplo:
O compilador não faz
obs
do tipoObservable<number | string>
.Pode surpreendê-lo que o seguinte fornecerá o erro
Use an observer instead of a complete callback
eExpected 2-3 arguments, but got 1.
É porque ele pode ser um de dois tipos diferentes e o compilador não é inteligente o suficiente para reconciliá-los.
Você precisa alterar seu código para retornar em
Observable<number | string>
vez deObservable<number> | Observable<string>
. As sutilezas disso variam dependendo do que você está fazendo.fonte
Eu estava recebendo o aviso porque estava passando este para assinar:
Como retorna um único valor, era incompatível com
subscribe
a assinatura da função de.Mudar para isso fez com que o aviso desaparecesse (retorna null / void);
fonte