xrfragment-haxe/src/3rd/js/pubsub.js

61 lines
1.7 KiB
JavaScript
Raw Normal View History

2023-06-02 12:00:21 +02:00
/*
* (promise-able) EVENTS
*
* example:
*
* xrf.addEventListener('foo',(e) => {
* // let promise = e.promise()
* console.log("navigating to: "+e.detail.destination.url)
* // promise.resolve()
* // promise.reject("not going to happen")
* })
*
* xrf.emit('foo',123)
* xrf.emit('foo',123).then(...).catch(...).finally(...)
*/
2023-10-26 13:19:03 +02:00
xrf.addEventListener = function(eventName, callback, scene) {
2023-10-26 18:45:13 +02:00
if( !this._listeners ) this._listeners = []
if (!this._listeners[eventName]) {
// create a new array for this event name if it doesn't exist yet
this._listeners[eventName] = [];
2023-10-26 13:19:03 +02:00
}
2023-10-26 18:45:13 +02:00
if( scene ) callback.scene = scene
// add the callback to the listeners array for this event name
this._listeners[eventName].push(callback);
return () => {
console.log("size = "+this._listeners[eventName].length)
this._listeners[eventName] = this._listeners[eventName].filter( (c) => c != callback )
console.log("size = "+this._listeners[eventName].length)
}
};
2023-10-26 13:19:03 +02:00
2023-06-02 12:00:21 +02:00
xrf.emit = function(eventName, data){
if( typeof data != 'object' ) throw 'emit() requires passing objects'
2023-06-02 12:00:21 +02:00
return xrf.emit.promise(eventName,data)
}
xrf.emit.normal = function(eventName, data) {
if( !xrf._listeners ) xrf._listeners = []
var callbacks = xrf._listeners[eventName]
if (callbacks) {
for (var i = 0; i < callbacks.length; i++) {
callbacks[i](data);
}
}
};
xrf.emit.promise = function(e, opts){
opts.XRF = xrf // always pass root XRF obj
return new Promise( (resolve, reject) => {
opts.promise = () => {
opts.promise.halted = true
return { resolve, reject }
}
xrf.emit.normal(e, opts)
delete opts.XRF
2023-06-02 12:00:21 +02:00
if( !opts.promise.halted ) resolve()
delete opts.promise
2023-06-02 12:00:21 +02:00
})
}