mirror of
https://github.com/elastic/kibana.git
synced 2025-04-23 09:19:04 -04:00
moved "listener.defer.resolved" off of the defer object, rebuilding logic now in one place
This commit is contained in:
parent
ac6bafab25
commit
6d5847a4d7
2 changed files with 21 additions and 12 deletions
|
@ -22,17 +22,24 @@ define(function (require) {
|
|||
this._listeners[name] = [];
|
||||
}
|
||||
|
||||
var listener = {
|
||||
defer: Promise.defer(),
|
||||
handler: handler
|
||||
};
|
||||
var listener = { handler: handler };
|
||||
|
||||
// capture the promise that is resolved when listener.defer is "fresh"/new
|
||||
// and attach it to the listener
|
||||
(function buildDefer(value) {
|
||||
|
||||
// we will execute the handler on each re-build, but not the initial build
|
||||
var rebuilding = listener.defer != null;
|
||||
|
||||
// capture then's promise, attach it to the listener
|
||||
listener.newDeferPromise = listener.defer.promise.then(function recurse(value) {
|
||||
listener.defer = Promise.defer();
|
||||
listener.newDeferPromise = listener.defer.promise.then(recurse);
|
||||
listener.deferResolved = false;
|
||||
listener.newDeferPromise = listener.defer.promise.then(buildDefer);
|
||||
|
||||
if (!rebuilding) return;
|
||||
|
||||
// we ignore the completion of handlers, just watch for unhandled errors
|
||||
Promise.try(handler, [value]).catch(notify.fatal);
|
||||
});
|
||||
}());
|
||||
|
||||
this._listeners[name].push(listener);
|
||||
};
|
||||
|
@ -74,19 +81,19 @@ define(function (require) {
|
|||
}
|
||||
|
||||
return Promise.map(this._listeners[name], function resolveListener(listener) {
|
||||
if (listener.defer.resolved) {
|
||||
// wait for listener.defer to be re-written
|
||||
if (listener.deferResolved) {
|
||||
// this listener has already been resolved by another call to events#emit()
|
||||
// so we wait for listener.defer to be recreated and try again
|
||||
return listener.newDeferPromise.then(function () {
|
||||
return resolveListener(listener);
|
||||
});
|
||||
} else {
|
||||
listener.deferResolved = true;
|
||||
listener.defer.resolve(value);
|
||||
listener.defer.resolved = true;
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
return Events;
|
||||
|
||||
};
|
||||
});
|
||||
|
|
|
@ -127,5 +127,7 @@ define(function (require) {
|
|||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('should only emit to handlers registered before emit is called');
|
||||
});
|
||||
});
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue