Chris@0: value = $value; Chris@0: } Chris@0: Chris@0: public function then( Chris@0: callable $onFulfilled = null, Chris@0: callable $onRejected = null Chris@0: ) { Chris@0: // Return itself if there is no onFulfilled function. Chris@0: if (!$onFulfilled) { Chris@0: return $this; Chris@0: } Chris@0: Chris@0: $queue = queue(); Chris@0: $p = new Promise([$queue, 'run']); Chris@0: $value = $this->value; Chris@0: $queue->add(static function () use ($p, $value, $onFulfilled) { Chris@0: if ($p->getState() === self::PENDING) { Chris@0: try { Chris@0: $p->resolve($onFulfilled($value)); Chris@0: } catch (\Throwable $e) { Chris@0: $p->reject($e); Chris@0: } catch (\Exception $e) { Chris@0: $p->reject($e); Chris@0: } Chris@0: } Chris@0: }); Chris@0: Chris@0: return $p; Chris@0: } Chris@0: Chris@0: public function otherwise(callable $onRejected) Chris@0: { Chris@0: return $this->then(null, $onRejected); Chris@0: } Chris@0: Chris@0: public function wait($unwrap = true, $defaultDelivery = null) Chris@0: { Chris@0: return $unwrap ? $this->value : null; Chris@0: } Chris@0: Chris@0: public function getState() Chris@0: { Chris@0: return self::FULFILLED; Chris@0: } Chris@0: Chris@0: public function resolve($value) Chris@0: { Chris@0: if ($value !== $this->value) { Chris@0: throw new \LogicException("Cannot resolve a fulfilled promise"); Chris@0: } Chris@0: } Chris@0: Chris@0: public function reject($reason) Chris@0: { Chris@0: throw new \LogicException("Cannot reject a fulfilled promise"); Chris@0: } Chris@0: Chris@0: public function cancel() Chris@0: { Chris@0: // pass Chris@0: } Chris@0: }