首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >reactPHP承诺同步执行

reactPHP承诺同步执行
EN

Stack Overflow用户
提问于 2015-09-08 09:17:04
回答 2查看 3K关注 0票数 4

我正在尝试用reactPHP实现类似js的承诺。但是由于某些原因,方法是同步执行的,只有在承诺解决后才会打印end_at

代码:

代码语言:javascript
复制
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().


}); 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-03 02:47:54

承诺本身并不是异步的。一个承诺本身就能让您运行一些代码,然后根据成功或失败执行一个不同的回调,然后将其中的几个概念链接在一起。

可以使用特定于任务的模块执行异步代码。如果您试图发出HTTP请求,可以使用ReactPHPhttp-客户端模块,如果您想异步执行系统命令,可以考虑使用子过程模块。

如果您想做完全不同或定制的事情,您应该将工作抽象为它自己的异步行为,类似于Predis异步库。也许可以使用允诺模块来提供成功/失败回调。

票数 5
EN

Stack Overflow用户

发布于 2018-11-25 07:07:05

代码中的问题是您使用的是一个阻塞函数:sleep()

这里引用了一些阻塞调用:https://github.com/reactphp/react/wiki/FAQ

但是承诺本身是异步的:它提供了在调用函数之前声明要在链中调用的函数的能力。

实际上,通过调用一个函数,您必须等到函数被执行,但是声明“那么您必须运行此函数”,您并不是真正地运行它,只要第一个调用返回。

所以

代码语言:javascript
复制
function iterate() {
    global $loop;

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

    $loop->addTimer(2, function () use ($deferred) {
        $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 when solved
    }, function($error) {

    }, function ($finally) {

    });


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


});

我以为你有一个全球性的$loop = React\EventLoop\Factory::create();,大多数时候都是有道理的。

在这里,$loop->addTimer()调用立即返回,因此iterate()返回未解决的承诺,因此将立即调用方法then(),序列执行将与您的echo end at ...一起进行。

then()方法将行为附加到返回的承诺,不执行作为参数传递的函数。但首先,承诺必须得到回报,问题是睡眠不是异步睡眠,而是真正的2秒睡眠!

注意,您在javascript中没有对应的睡眠,您有setTimeout(),它的行为就像下面的$loop->addTimer()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32453834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档