/** @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();
 }
Beispiel #2
0
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);
}
Beispiel #3
0
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);
}