Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

请教一个promise异步的问题 #24

Closed
reatang opened this issue Jul 27, 2016 · 4 comments
Closed

请教一个promise异步的问题 #24

reatang opened this issue Jul 27, 2016 · 4 comments

Comments

@reatang
Copy link

reatang commented Jul 27, 2016

在学习hprose的过程中,遇到了一个惊到一众phper的效果
php version 5.6.20
image
结果的话大大应该也清楚了
image

真异步了!学艺不精,研习了一天源码也没有搞懂这个异步到底是怎么实现的。只有前来请教了。

@andot
Copy link
Member

andot commented Jul 27, 2016

当调用 hello 的时候,如果是异步客户端,并不是立即发起网络调用,而是先返回一个 $promise 对象,这个东西相当于一个占位符,然后程序继续往下执行,直到遇到 $client->loop() 这条语句,才开始执行执行网络传输,这个时候可能已经有多个调用请求了,这些请求会并发的进行,然后根据收到最终结果的顺序来充填 $promise 对象,$promise 对象被充填后,它的 then 方法中的回调就会执行。

当没有显式的执行 $client->loop(); 时,那等到 $client 的析构方法执行时,会自动执行 $client->loop();,所以你会看到结果在 exit 输出的 123 之后。

@andot
Copy link
Member

andot commented Jul 27, 2016

上面说的是 Hprose\Http\Client 的实现方式,Hprose\Swoole\Http\Client 则是直接使用 swoole_http_client 客户端来实现的异步。在实现方式上完全不同,不过使用方式上没有区别。

@reatang
Copy link
Author

reatang commented Jul 29, 2016

原来如此,确实没有仔细看__destruct方法。谢谢指导!

@andot
Copy link
Member

andot commented Jul 29, 2016

不客气。因为 __destruct 不一定会执行,所以对于 Hprose\Http\Client 和 Hprose\Socket\Client 来说,最好是手动在合适的位置调用 loop 方法。Swoole 客户端就不需要了(Swoole 客户端也没有这个方法)。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants