4
respostas

Reflect.set em variável vs direto no return

Por que isso acontece?

            set(target, prop, value, receiver) {
                let retorno = Reflect.set(target, prop, value, receiver);

                if (props.includes(prop)) {
                    acao(target);
                }

                // Se colocar 
                // return Reflect.set(target, prop, value, receiver) 
                // nao funciona
                return retorno;
            }
4 respostas

Qual erro?

Oi Flavio, se eu colocar o Reflect.set direto no retorno (e obviamente não ter a variável retorno), a mensagem não é exibida na view.

Mostre o código completo do criador de proxy.

Rodrigo,

o que ocorre nessa situação é apenas questão de ordem de execução das coisas, vamos ao primeiro cenário sugerido por você:

set(target, prop, value, receiver) {
    if (props.includes(prop)) {
        acao(target);
    }
    return Reflect.set(target, prop, value, receiver);
}

Neste caso, o método testa a se a propriedade deve ser intercptada, executa a ação (que no caso é a atualização da view) e depois que aplica o Reflect! Ou seja, quando a view é atualizada, a mensagem ainda não foi setada pois o Reflect.apply ainda não ocorreu!

O bloco do if também não pode ser executado depois pois não podemos ter instruções após a clausula return

Agora vamos ao segundo cenário:

set(target, prop, value, receiver) {
    let retorno = Reflect.set(target, prop, value, receiver);

    if (props.includes(prop)) {
        acao(target);
    }
    return retorno;
}

Neste caso agora a primeira coisa executa é o Reflect.set para atribuir o valor a propriedade e só então a propriedade é testada verificando se a ação (que no caso é a atualização da view) deve ser executada!

Mas o método set espera um valor booleano como retorno que é justamente o resultado gerado pelo Reflect.apply e por isso precisamos armazenar esse resultado para encaminha-lo depois!

Caso você execute o primeiro cenario, a aplicação só exibiria a mensagem na segunda execução, pois as coisas ocorreriam na seguinte ordem:

Executa chamada 01: 1 - Atualiza mensagemView (mensagem.texto=null) 2-Atribui mensagem (mensagem.texto = <valor_chamada_01>)

Executa chamada 02: 1 - Atualiza mensagemView (mensagem.texto=<valor_chamada_01>) 2-Atribui mensagem (mensagem.texto = <valor_chamada_02>)

Observe que na verdade como as chamadas atribuem o mesmo texto, as vezes não percebemos, mas a mensagem que aparece na segunda chamada, é o valor que foi atribuído ainda na primeira execução!

Espero que possa esclarecer sua dúvida!

Até mais e bons estudos