Estoy trabajando con el marco Ext JS. Tenemos un ViewModel bastante complejo con muchas fórmulas vinculadas a otras fórmulas. Me gustaría poder ejecutar algún código solo una vez que ViewModel haya terminado su larga cascada de eventos que desencadenan eventos. Estoy tratando de verificar que, después de que se hayan calculado todas las fórmulas de ViewModel, si el modelo de datos permanece o no idéntico a los valores esperados para los campos calculados devueltos por nuestra API, básicamente una verificación diferida de model.isDirty() .
Intenté usar setTimeout para agregar mi evento al final de la cola de eventos, pero a veces termina activándose en medio de la cascada de actualización de fórmulas. Simplemente podría establecer un tiempo de espera más largo, pero eso se siente torpe, obligaría al usuario a esperar más y no se puede garantizar que funcione en un navegador particularmente lento.
¿Hay una buena manera de ejecutar el código tan pronto como ViewModel termine de calcular, y no un momento antes?
¿Hay alguna manera de verificar si ViewModel está listo o no?
¿Hay alguna manera de diferir un evento de manera similar a setTimeout, pero que se ejecute solo después de que la cola de eventos esté completamente vacía?
He resuelto mi propio problema.
En la versión 7.3.1 de Ext JS, puede inspeccionar el miembro ScheduledCount del scheduledCount de ViewModel para averiguar si hay fórmulas de ViewModel esperando para ejecutarse. Si el valor es cero, puede estar seguro de que ViewModel ha terminado de calcular.
const scheduler = this.getViewModel().getScheduler(); setTimeout(awaitViewModelFinished, 0); function awaitViewModelFinished() { if (scheduler.scheduledCount > 0) { setTimeout(awaitViewModelFinished, 0); return; } // Payload code goes here. }No pude encontrar una característica compatible del marco para hacer esto. Según los documentos de sencha , "[Scheduler] es una clase de utilidad privada para uso interno del marco. No confíe en su existencia". Si está utilizando otra versión de Ext JS, es posible que deba encontrar una solución similar pero diferente para esto.
Dentro del controlador puedes usar:
// come viewModel options might not be resolved this.getViewModel().notify(); // all viewModel options are solved!!Cuidado: si un enlace es nulo, la fórmula enlazada no se ejecutará.