2015-09-08 2 views
2

J'essaie d'implémenter des promesses de type js avec reactPHP. Mais pour une raison quelconque les méthodes exécutées de façon synchrone, le end_at imprimé seulement après que la promesse est résolue.Les promesses de reactPHP sont exécutées de façon synchrone

code:

function iterate() { 


    $deferred = new \React\Promise\Deferred(); 

    sleep(2); 

    $deferred->resolve(); 

    return $deferred->promise(); 

} 

Route::get('test/async', function() { 


    echo "start execution at ".time()."<br>"; // this executed first 

    iterate()->then(function($result) { 
     echo "got result result at ". time() . "<br>"; // this is second 
    }, function($error) { 

    }, function ($finally) { 

    }); 


    echo "end at " . time(); // this is executed only after then(). 


}); 

Répondre

1

La promesse est lui-même ne pas asynchrone. Une promesse en soi vous offre simplement la possibilité d'exécuter du code puis un callback différent basé sur le succès ou l'échec, puis enchaîne plusieurs de ces concepts ensemble.

Le code asynchrone peut être exécuté à l'aide d'un module spécifique à votre tâche. Si vous tentez d'effectuer une requête HTTP, vous pouvez utiliser le module http-client de ReactPHP. Si vous souhaitez exécuter une commande système de manière asynchrone, vous pouvez envisager d'utiliser le module child-process.

Si vous cherchez à faire quelque chose de complètement différent ou sur mesure, vous devez faire abstraction de l'œuvre dans son propre comportement asynchrone, similaire au Predis async library. Peut-être utiliser le module de promesse pour fournir des rappels de réussite/échec.