2017-03-08 65 views
1

我正在玩React並想嘗試獲得工作超時功能。繼(排序)從https://github.com/reactphp/promise-timer#timeout的例子,單元測試,我想出了:反應PHP超時總是可以解決

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"); 
     } 
    ); 
} 

但這始終以「做」解析無論我有多低在定時器\超時的時間。我錯過了什麼?

回答

1

你的代碼的問題是它阻塞。它同步解決了這個承諾。它無處可返回到事件循環驅動程序,以便它可以安排超時監視器。

嘗試更改您的代碼以使用超時作爲模擬例如。網絡超時。

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

$loop->run(); 

不幸的是,你必須傳遞React中的循環。