5
respostas

Dúvida na função save()

Após alterar o código da função save() para usar o switchMap, como conseguimos pegar o callback de erro caso ocorra algo de errado na API ?

this.comments$ = this.photoService
            .addComment(this.photoId, comment)            
            .pipe(switchMap(() => this.comments$ = this.photoService.getComments(this.photoId))) 
            .pipe(tap(() => { // antes de retornar o observable de cima faz isso
                this.commentForm.reset();
                alert('Comentário adicionado com sucesso.');
            }))
5 respostas

Fala ai Jean, tudo bem? Você pode estar utilizando o operador catchError e encadeando mais um pipe nas chamadas:

this.comments$ = this.photoService
    .addComment(this.photoId, comment)            
    .pipe(switchMap(() => this.comments$ = this.photoService.getComments(this.photoId))) 
    .pipe(tap(() => { // antes de retornar o observable de cima faz isso
        this.commentForm.reset();
        alert('Comentário adicionado com sucesso.');
    }).pipe(catchError(err => {
        // verifica se deu erro...
    })
)

Caso algum pipe tenha dado erro ele vai cair no catchError e você pode fazer o tratamento.

Se o catchError retornar um Observable quem chamou o serviço não vai tomar erro, porém, se o catchError lançar uma excessão, quem chamou o serviço vai receber um erro.

Espero ter ajudado.

Matheus bom dia. Copiando o código enviado esta dando a seguinte mensagem..

Property 'pipe' does not exist on type 'MonoTypeOperatorFunction<{}>'.

Fala ai Jean, escrevi errado o código, tenta assim:

this.comments$ = this.photoService
    .addComment(this.photoId, comment)            
    .pipe(switchMap(() => this.comments$ = this.photoService.getComments(this.photoId))) 
    .pipe(catchError(err => {
        // verifica se deu erro...
    })
    .pipe(tap(() => { // antes de retornar o observable de cima faz isso
        this.commentForm.reset();
        alert('Comentário adicionado com sucesso.');
    })
)

Espero ter ajudado.

Matheus colocando o seguinte código

this.comments$ = this.photoService
            .addComment(this.photoId, comment)            
            .pipe(switchMap(() => this.comments$ = this.photoService.getComments(this.photoId))) 
            .pipe(catchError(err => {
                console.log(err);
            })
            .pipe(tap(() => { // antes de retornar o observable de cima faz isso
                this.commentForm.reset();
                alert('Comentário adicionado com sucesso.');
            }))

retorna o erro: Argument of type '(err: any) => void' is not assignable to parameter of type '(err: any, caught: Observable<{}>) => ObservableInput<{}>'. Type 'void' is not assignable to type 'ObservableInput<{}>'

Sei que o erro é pq a variavel é do tipo observable, nesse caso como resolver essa questão?

Fala Jean, você precisa realizar o tratamento dentro do catchError.

Ele precisa retornar um Observable ou lançar uma exceção.

Espero ter ajudado.