/**
*
* @param EventEmitterInterface $emitter
* @param string[] $fulfillEvents
* @param string[] $rejectEvents
* @param string[] $notifyEvents
* @return ExtendedPromiseInterface
*/
public static function listen(EventEmitterInterface $emitter, array $fulfillEvents = [], array $rejectEvents = [], array $notifyEvents = [])
{
$listeners = [];
$removeListeners = function () use($emitter, &$listeners) {
foreach ($listeners as $event => $callback) {
$emitter->removeListener($event, $callback);
}
$listeners = [];
};
$promise = new Promise(function ($resolve, $reject, $notify) use($emitter, &$listeners, $fulfillEvents, $rejectEvents, $notifyEvents) {
$listeners = array_merge(static::registerCallbacks($emitter, $fulfillEvents, $resolve), static::registerCallbacks($emitter, $rejectEvents, $reject), static::registerCallbacks($emitter, $notifyEvents, $notify));
}, $removeListeners);
return $promise->always($removeListeners);
}