moved "listener.defer.resolved" off of the defer object, rebuilding logic now in one place

This commit is contained in:
Spencer Alger 2014-08-06 15:20:25 -07:00
parent ac6bafab25
commit 6d5847a4d7
2 changed files with 21 additions and 12 deletions

View file

@ -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;
};
});

View file

@ -127,5 +127,7 @@ define(function (require) {
done();
});
});
it('should only emit to handlers registered before emit is called');
});
});