Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Aplicação para mensagem, funcionamento do return e do Reflect.set

Saudações,

Tentei fazer a mesma coisa que foi aplicada à Lista de negociações na classe Mensagem e me deparei com algumas questões.

Quando faço:

  this._mensagem = new Proxy(new Mensagem(), {

            set(target, prop, value, receiver) {
              if(prop == 'texto') {
          return function() {
                      target[prop] = value;
                      self._mensagemView.update(target);
                        }
          }
              return Reflect.set(target, prop, value, receiver);
            }
        });

A função de retorno nunca é executada. Cheguei a inserir um console.log dentro do if e antes da função de retorno e este foi executado. Ou seja, quando o programa chega na linha da função de retorno, ele simplesmente retorna sem executar nada interno à ela. Esse comportamento não acontece com a implementação semelhante em ListaNegociações.

Tentando resolver o problema eu mudei o código para:

  this._mensagem = new Proxy(new Mensagem(), {

            set(target, prop, value, receiver) {
              if(prop == 'texto') {
                  target[prop] = value;
                  self._mensagemView.update(target);
                  return;
              }
              return Reflect.set(target, prop, value, receiver);
            }
        });

Funcionou, contudo eu comecei a receber um erro no console "TypeError: 'set' on proxy: trap returned falsish for property 'texto'".

Resolvi novamente trocar a abordagem e fiz:

  this._mensagem = new Proxy(new Mensagem(), {

            set(target, prop, value, receiver) {
              if(prop == 'texto') {
                  console.log(`interceptando`);
                  target[prop] = value;
                  self._mensagemView.update(target);
                  return function(){};
              }
              return Reflect.set(target, prop, value, receiver);
            }
        });

retornando agora uma função vazia, já que a primeira abordagem não dava este erro e também não executava o que havia na função. Funcionou perfeitamente e parou de dar erro. Por último, lendo o erro melhor, eu imaginei que a condição para não dar o erro era retornar verdadeiro, então fiz por fim :

  this._mensagem = new Proxy(new Mensagem(), {

            set(target, prop, value, receiver) {
              if(prop == 'texto') {
                  console.log(`interceptando`);
                  target[prop] = value;
                  self._mensagemView.update(target);
                  return true;
              }
              return Reflect.set(target, prop, value, receiver);
            }
        });

O código passou a funcionar e o erro de retorno no console não voltou.

As dúvidas são: Por que, na primeira implementação, a função de retorno não estava sendo executada? O retorno de uma trap de proxy sempre tem que ser verdadeiro?

1 resposta
solução!

Fala ai Eric, tudo bem? Parece saber exatamente porque o primeiro código não funcionou eu precisaria dar uma olhada no problema com mais calma, simulando, debugando e analisando os códigos da aplicação.

Mas, não, uma o set de uma Proxy não precisa retornar sempre verdadeiro e sim um valor booleano, o true indica que a operação ocorreu com sucesso.

O false caso esteja no strict mode vai lançar um erro.

Espero ter ajudado.