Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Esclarecimento de map, of e observe:'response'

Gostaria de esclarecer o meu entendimento desse método(ele faz o like de uma foto). Ele recebe como parâmetro o Id da foto para fazer a requisição post para a API e está usando o observe: 'response' (significa que receberemos a resposta completa, não só o corpo ou o cabeçalho dela?). Então, com o retorno da requisição que será um Observable do tipo Object, usamos o pipe para encadear a função map que transformará o Observable atual para um Observable do tipo boolean, que receberá o valor true. Usando outro pipe para encadear outra função que irá capturar um eventual erro e se esse erro tiver o status 304 o observable anterior será desconsiderado e um novo será criado do tipo boolean e com valor false, se for algum outro erro o erro continuará. Obs: o código 304 será retornado quando um usuário tentar curtir uma foto que ele já curtiu. Isso é configurado pelo backend(api)?

like(photoId:number) {
        return this.http.post(API + '/photos' + photoId + '/like', {}, { observe: 'response'})
        .pipe( map(res => true ))
        .pipe( catchError(err => {
            return err.status == '304' ? of(false) : throwError(err);
        }))
    }
3 respostas
solução!

Fala ai Lucas, tudo bem? Vamos lá:

Ele recebe como parâmetro o Id da foto para fazer a requisição post para a API e está usando o observe: 'response' (significa que receberemos a resposta completa, não só o corpo ou o cabeçalho dela?)

Por padrão o Angular vai retornar apenas o body da requisição, ao informar o observe: 'response', estamos dizendo para ele que também queremos as informações do cabeçalho (headers) e códigos de resposta (http status code).

Então, com o retorno da requisição que será um Observable do tipo Object, usamos o pipe para encadear a função map que transformará o Observable atual para um Observable do tipo boolean, que receberá o valor true.

Na verdade o Observable vai ser o mesmo, o que vai mudar é seu valor, que agora será um booleano.

Usando outro pipe para encadear outra função que irá capturar um eventual erro e se esse erro tiver o status 304 o observable anterior será desconsiderado e um novo será criado do tipo boolean e com valor false, se for algum outro erro o erro continuará.

Isso mesmo, aqui caso o código da resposta seja 304 será retornado um novo Observable com o valor false, se não, também será retornado um Observable, porém, o mesmo vai disparar a função de erro.

Obs: o código 304 será retornado quando um usuário tentar curtir uma foto que ele já curtiu. Isso é configurado pelo backend(api)?

Isso mesmo, essa regra está na API (back-end).

Espero ter ajudado.

Obrigado pelo esclarecimento!

Magina Lucas, sempre que precisar não deixe de criar suas dúvidas.

Abraços e bons estudos.