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