A assinatura está obsoleta: use um observador em vez de um retorno de chamada de erro

103

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!

ismaestro
fonte
1
* então tente usar.subscribe({ next: this.handleUpdateResponse.bind(this), error: this.handleError.bind(this) })
kos
Não consigo fazer funcionar com o meu apiRest
Javier

Respostas:

144

subscribenão está obsoleto, apenas a variante que você está usando está obsoleta. No futuro, subscribeterá apenas um argumento: o nextmanipulador (uma função) ou um objeto observador.

Portanto, no seu caso, você deve usar:

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

Veja estes problemas do GitHub:

Martin
fonte
6
idk ... pairando em vs código ainda mostra obsoleto com essa sintaxe (rxjs 6.5.3)
Yannic Hamann
7
Olá @YannicHamann, este comentário explica o porquê. Não está obsoleto, eles apenas suspenderam uma das sobrecargas e agora parece que tudo está obsoleto. É um problema de ferramentas principalmente.
Reitor
Acho que esta resposta não é mais válida, pois todos os métodos de assinatura estão obsoletos agora no rxjs 6.5.4
Alok Rajasukumaran
44

Talvez seja interessante notar que o observerObjeto também pode (ainda) conter o complete()método e outras propriedades adicionais. Exemplo:

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

Dessa forma, é muito mais fácil omitir certos métodos. Com a assinatura antiga era necessário fornecer undefinede manter a ordem dos argumentos. Agora é muito mais claro quando, por exemplo, fornecemos apenas um manipulador seguinte e completo.

magikMaker
fonte
11

Você pode obter este erro se tiver um objeto digitado como Observable<T> | Observable<T2>- em vez de Observable<T|T2>.

Por exemplo:

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

O compilador não faz obsdo tipo Observable<number | string>.

Pode surpreendê-lo que o seguinte fornecerá o erro Use an observer instead of a complete callbackeExpected 2-3 arguments, but got 1.

obs.subscribe(value => {

});

É 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 de Observable<number> | Observable<string>. As sutilezas disso variam dependendo do que você está fazendo.

Simon_Weaver
fonte
2

Eu estava recebendo o aviso porque estava passando este para assinar:

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

Como retorna um único valor, era incompatível com subscribea assinatura da função de.

Mudar para isso fez com que o aviso desaparecesse (retorna null / void);

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