1

我在玩 React 并想尝试获得一个工作超时功能。遵循(某种)来自https://github.com/reactphp/promise-timer#timeout的示例和单元测试我想出了:

use React\Promise\Timer;

$promise = uncertainOperation();
$loop = \React\EventLoop\Factory::create();

Timer\timeout($promise, 1, $loop)->then(
    function ($value) {
        var_dump($value);
    }
    ,
    function ($error) {
        var_dump($error);
    }
);

$loop->run();

function uncertainOperation() {
    return new React\Promise\Promise(
        function ($resolve) {
            for($i = 0; $i < 30000000; $i++) { }
            $resolve("Done");
        }
    );
}

但是,无论我在Timer\timeout中设置的时间有多低,这总是以“完成”来解决。我错过了什么?

4

1 回答 1

1

您的代码的问题在于它会阻塞。它同步地解决了承诺。它不会在任何地方返回事件循环驱动程序,因此它可以安排超时观察程序。

尝试更改您的代码以使用超时来模拟例如网络超时。

function uncertainOperation($loop) {
    return new React\Promise\Promise(
        function ($resolve) use ($loop) {
            $loop->addTimer(5, function () {
                $resolve("Done");
            });
        }
    );
}

$loop->run();

不幸的是,你必须在 React 中绕过循环。

于 2017-03-12T12:10:19.253 回答