In trying to use importmap with stimulus `stimulus-loading' and I've run into a challenge with race conditions.
For example, say I have the following code.
// send_controller.js
export default class extends Controller {
connect() {
this.dispatch('connected')
}
}
// receive_controller.js
export default class extends Controller {
catch() {
console.log('catch');
}
}
<div data-controller="receive send"
data-action="send:connected->receive#catch"></div>
- send controller dispatches a connected event on
connect()
- send controller event runs action
receive#catch
In the case of importmap, sometimes the send controller loads and executes before receive controller loaded. The event is dispatched but nothing happens because the receive controller is not loaded.
I've explored other options:
Option 1: turbo:load@window->receive#catch
This works for visits, but not not if the content is loaded via turbo-frame or a FORM turbo-stream response with lazyLoadControllersFrom
Option 2: turbo:load@window->receive#catch turbo:frame-load@window->receive#catch
This works for visits and turbo-frame, but still not for FORM turbo-stream response with lazyLoadControllersFrom.
I thought perhaps I could tap into the solution outlined in #57, but the PR is closed.
Is there a solution I'm not aware of that works with visit, turbo-frame and turbo-stream scenarios? Perhaps an event which indicates that all the stimulus controllers have been loaded and ready to execute? Should stimulus hold off on executing javascript until controllers finish loading?
In trying to use importmap with stimulus `stimulus-loading' and I've run into a challenge with race conditions.
For example, say I have the following code.
connect()receive#catchIn the case of importmap, sometimes the send controller loads and executes before receive controller loaded. The event is dispatched but nothing happens because the receive controller is not loaded.
I've explored other options:
Option 1:
turbo:load@window->receive#catchThis works for visits, but not not if the content is loaded via
turbo-frameor a FORMturbo-streamresponse withlazyLoadControllersFromOption 2:
turbo:load@window->receive#catch turbo:frame-load@window->receive#catchThis works for visits and
turbo-frame, but still not for FORMturbo-streamresponse withlazyLoadControllersFrom.I thought perhaps I could tap into the solution outlined in #57, but the PR is closed.
Is there a solution I'm not aware of that works with visit, turbo-frame and turbo-stream scenarios? Perhaps an event which indicates that all the stimulus controllers have been loaded and ready to execute? Should stimulus hold off on executing javascript until controllers finish loading?