es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Pérdida de alcance en la devolución de llamada, cómo utilizar bind de manera efectiva.

En mi caso, localesCollection dentro de compareValue tiene un valor antiguo (no actualizado). El estado no es en tiempo real. Supuse que bind estaba aquí para salvar el día.

// Redux
let localesCollectionValues = useSelector((state: IStore) => state.localesStoreSlice.localesCollectionValues);

const compareValue = (fieldValue: any): void => {
    console.log('compareValue', fieldValue, localesCollectionValues);
}

const attachListeners = () => {
    console.log('attachListeners');
    Object.keys(sdk.entry.fields).forEach((field: string) => {
        const fieldRef: any = sdk.entry.fields[field];
        fieldRef.locales.forEach((localeKey: string) => {     
            fieldRef.getForLocale(localeKey).onValueChanged(compareValue.bind(this));
        });
    });
};

editar:
provenía de tener la función de flecha directamente en la función de retorno con el mismo problema que se describe arriba

editar2:
el valor de ‘localesCollectionValues’ es el valor en el momento en que el código se inicializa y se establece el controlador. Después de eso, no se actualiza y solo mantiene una referencia antigua. Es un problema típico de puntero de memoria / alcance, necesito una dirección para resolver esto.

fieldRef.getForLocale(localeKey).onValueChanged(() => {
   console.log(localesCollectionValues) // <- no es en tiempo real, contiene un valor antiguo
});
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema descrito anteriormente está relacionado con el alcance y la vinculación en JavaScript. La función de devolución de llamada en el evento onValueChanged no puede acceder al valor actualizado de localesCollection, ya que no está vinculada al contexto actual. La solución sugerida es utilizar la función bind para asociar el contexto actual con la función de devolución de llamada. Sin embargo, esto no resolvió el problema.

    Tras una inspección más detallada, se descubrió que el problema estaba en la función de flecha utilizada directamente en la devolución de llamada, la cual creaba un nuevo contexto y no podía acceder al valor actualizado de localesCollection. La solución es utilizar una declaración de función regular, la cual vinculará el contexto actual a la función de devolución de llamada.

    También es importante tener en cuenta que el valor de localesCollectionValues es el valor en el momento en que se inicializa el código y se establece el controlador. Después de eso, no se actualiza y mantiene una referencia antigua al valor. Este es un problema típico de puntero de memoria/alcance que debe abordarse.

Comments are closed.