$subPromise) { $subPromise->then( function ($result) use ($promiseIndex, &$completeResult, &$successCount, $success, $promises) { $completeResult[$promiseIndex] = $result; ++$successCount; if ($successCount === count($promises)) { $success($completeResult); } return $result; } )->otherwise( function ($reason) use ($fail) { $fail($reason); } ); } }); } /** * The race function returns a promise that resolves or rejects as soon as * one of the promises in the argument resolves or rejects. * * The returned promise will resolve or reject with the value or reason of * that first promise. * * @param Promise[] $promises */ function race(array $promises): Promise { return new Promise(function ($success, $fail) use ($promises) { $alreadyDone = false; foreach ($promises as $promise) { $promise->then( function ($result) use ($success, &$alreadyDone) { if ($alreadyDone) { return; } $alreadyDone = true; $success($result); }, function ($reason) use ($fail, &$alreadyDone) { if ($alreadyDone) { return; } $alreadyDone = true; $fail($reason); } ); } }); } /** * Returns a Promise that resolves with the given value. * * If the value is a promise, the returned promise will attach itself to that * promise and eventually get the same state as the followed promise. * * @param mixed $value */ function resolve($value): Promise { if ($value instanceof Promise) { return $value->then(); } else { $promise = new Promise(); $promise->fulfill($value); return $promise; } } /** * Returns a Promise that will reject with the given reason. */ function reject(Throwable $reason): Promise { $promise = new Promise(); $promise->reject($reason); return $promise; } __halt_compiler();----SIGNATURE:----qpEWSk/oDNdjyKx1UUWyuYpeR6euQeZynHmxjzQbiN+KjFkHCXS0VkJ2+8qXgahdgmpw0TSdJPbbWEVgIp9qxayusM+qVIVWfJsbpT4L4vDklafwDU4ptrd9QsWmyFQZkbHJC5D317QFrnXsQ4UNAs2EEAMFriZSzS3faTaatP1ZA39Nw/pjYuhGwU8oSQqBwEOdFvsSvpZgWBjnIYhw3F7lrM99lZXEAazvaAzOf5FMOyS+/Lr9e9cWe1xHu7pr4rvFA/xNnffipjGDtQpA5cqmR4Q8bEAHXnF8M9knXko6ACiFDFfx2LYiFlJfRH8/RblH5Bt3OPWvW5Xs9rjBDnNKVmWmzDUNrqwzNvyNqWXhuj4bOtwxax8qdJtwxr3TswkOSwJr53qm9RevbIrdBs63qhkpfgE0E902JKdmG39QpKbI2sVABQSpUJeaQ9QmXy3qJpOsJQG9BqHcW+4IPMRTQws4D0OVa05RFEbZ0Wn3zDsFCcxT9LhFvRv3GaD/31xcN5cgW9VNcb0x+toIgboV3QnDh7cZEuZk2ekbYGsxiVTqf83EG/yFzwKU/BXf6Kb7fKxH2576BuTbj9wOHcqOfiYPxX430xHvLQhWqo59Q8slo19JZwAVUlOFTbjC6W8S1jMsrT4t15A9IHDBzNJKrNBstf2Z3lA5fJTgYsY=----ATTACHMENT:----Mjc4OTkzMjUwMDg4MjQ3NyA4MjY5MTE0OTI1NDY3MzI0IDE5NDkxODAwOTk1NjU2Nzk=