2016-05-05 18 views
2

私はここにicicle.ioを使用し... PHPでの非同期関数から値を返すしたいと思いますが、私は何でも使って幸せ、それは私がやりたいん提供!とにかく、これは私がが本当にが行う機能でその最後の少しを置くためにされたい何非同期PHPから値を返す

<?php 

require __DIR__ . '/vendor/autoload.php'; 

use Icicle\Coroutine\Coroutine; 
use Icicle\Loop; 

function getArray($int) { 
    yield array ($int, $int + 1, $int + 2); 
} 

function getArrays() { 
    $numbers = array (1, 4, 7); 
    $results = array(); 

    foreach ($numbers as $number) { 
     array_push($results, (yield(getArray($number)))); 
    } 

    yield call_user_func_array('array_merge', $results); 
} 

$coroutine = new Coroutine(getArrays()); 

$data = $coroutine->then(
    function ($result) { 
     $data = print_r($result, true); 
     return "Result: {$data}\n"; 
    }, 
    function (Exception $e) { 
     echo "Error: {$e->getMessage()}\n"; 
    } 
)->done(function ($value) { 
    echo $value; 
}); 

Loop\run(); 

以下のいくつかのコードがあるので、それはより次のようになります。そして、

function sync() { 
    $coroutine = new Coroutine(getArrays()); 

    $data = $coroutine->then(
     function ($result) { 
      $data = print_r($result, true); 
      return "Result: {$data}\n"; 
     }, 
     function (Exception $e) { 
      echo "Error: {$e->getMessage()}\n"; 
     } 
    )->done(function ($value) { 
     return $value; 
    }); 

    Loop\run(); 

    return /* the value */; 
} 

私のクールなソフトウェアから、私は同期のようにsync()を呼び出すことができます。悲惨なことに、非同期の俗語が背後で起こっていることに気づいていません。

誰でもこれをやっているのですか、私はどうすればよいでしょうか?現時点ではが最高です私は出力バッファーを使用しています(ab)です。& serialize()/unserialize()の機能がありますが、パフォーマンスを向上させるためにすべてのことをやっています。

答えて

1

あなたは同期wait()法を用いて、(コルーチンを含む)Awaitableの解像度を待つことができます。このメソッドは、コルーチンが解決されるまでイベントループをチェックします。つまり、sync()関数は、単にコルーチンオブジェクト上でこのメソッドを呼び出し、その結果を返すことができます。

function sync() { 
    $coroutine = new Coroutine(getArrays()); 
    return $coroutine->wait(); 
} 
関連する問題