1<?php 2 3namespace GuzzleHttp\Promise; 4 5/** 6 * A promise that has been fulfilled. 7 * 8 * Thenning off of this promise will invoke the onFulfilled callback 9 * immediately and ignore other callbacks. 10 */ 11class FulfilledPromise implements PromiseInterface 12{ 13 private $value; 14 15 public function __construct($value) 16 { 17 if (is_object($value) && method_exists($value, 'then')) { 18 throw new \InvalidArgumentException( 19 'You cannot create a FulfilledPromise with a promise.' 20 ); 21 } 22 23 $this->value = $value; 24 } 25 26 public function then( 27 callable $onFulfilled = null, 28 callable $onRejected = null 29 ) { 30 // Return itself if there is no onFulfilled function. 31 if (!$onFulfilled) { 32 return $this; 33 } 34 35 $queue = Utils::queue(); 36 $p = new Promise([$queue, 'run']); 37 $value = $this->value; 38 $queue->add(static function () use ($p, $value, $onFulfilled) { 39 if (Is::pending($p)) { 40 try { 41 $p->resolve($onFulfilled($value)); 42 } catch (\Throwable $e) { 43 $p->reject($e); 44 } catch (\Exception $e) { 45 $p->reject($e); 46 } 47 } 48 }); 49 50 return $p; 51 } 52 53 public function otherwise(callable $onRejected) 54 { 55 return $this->then(null, $onRejected); 56 } 57 58 public function wait($unwrap = true, $defaultDelivery = null) 59 { 60 return $unwrap ? $this->value : null; 61 } 62 63 public function getState() 64 { 65 return self::FULFILLED; 66 } 67 68 public function resolve($value) 69 { 70 if ($value !== $this->value) { 71 throw new \LogicException("Cannot resolve a fulfilled promise"); 72 } 73 } 74 75 public function reject($reason) 76 { 77 throw new \LogicException("Cannot reject a fulfilled promise"); 78 } 79 80 public function cancel() 81 { 82 // pass 83 } 84} 85