/** @test */ public function rethrowsExceptionsThrownFromCancel() { $this->setExpectedException('\\Exception', 'test'); $mock = $this->getMock('React\\Promise\\CancellablePromiseInterface'); $mock->expects($this->once())->method('cancel')->will($this->throwException(new \Exception('test'))); $cancellationQueue = new CancellationQueue(); $cancellationQueue->enqueue($mock); $cancellationQueue(); }
function reduce($promisesOrValues, callable $reduceFunc, $initialValue = null) { $cancellationQueue = new CancellationQueue(); $cancellationQueue->enqueue($promisesOrValues); return new Promise(function ($resolve, $reject, $notify) use($promisesOrValues, $reduceFunc, $initialValue, $cancellationQueue) { resolve($promisesOrValues)->done(function ($array) use($reduceFunc, $initialValue, $cancellationQueue, $resolve, $reject, $notify) { if (!is_array($array)) { $array = []; } $total = count($array); $i = 0; // Wrap the supplied $reduceFunc with one that handles promises and then // delegates to the supplied. $wrappedReduceFunc = function ($current, $val) use($reduceFunc, $cancellationQueue, $total, &$i) { $cancellationQueue->enqueue($val); return $current->then(function ($c) use($reduceFunc, $total, &$i, $val) { return resolve($val)->then(function ($value) use($reduceFunc, $total, &$i, $c) { return $reduceFunc($c, $value, $i++, $total); }); }); }; $cancellationQueue->enqueue($initialValue); array_reduce($array, $wrappedReduceFunc, resolve($initialValue))->done($resolve, $reject, $notify); }, $reject, $notify); }, $cancellationQueue); }
function reduce(array $promisesOrValues, callable $reduceFunc, $initialValue = null) { $cancellationQueue = new CancellationQueue(); return new Promise(function ($resolve, $reject) use($promisesOrValues, $reduceFunc, $initialValue, $cancellationQueue) { $total = count($promisesOrValues); $i = 0; $wrappedReduceFunc = function ($current, $val) use($reduceFunc, $cancellationQueue, $total, &$i) { $cancellationQueue->enqueue($val); return $current->then(function ($c) use($reduceFunc, $total, &$i, $val) { return resolve($val)->then(function ($value) use($reduceFunc, $total, &$i, $c) { return $reduceFunc($c, $value, $i++, $total); }); }); }; $cancellationQueue->enqueue($initialValue); array_reduce($promisesOrValues, $wrappedReduceFunc, resolve($initialValue))->done($resolve, $reject); }, $cancellationQueue); }