PHP中的Promise

简介

前几天看到一篇文章理解 Promise 的工作原理,想起了之前自己写过的一篇文章jQuery.Deferred对象DeferredjQueryPromise的实现。我就在想世界上最好的语言没有对这东西的实现吗?

一查,果然发现2个比较靠谱的库react/promiseguzzlehttp/promises。看了一下文档比较一下之后,觉得react/promise跟靠近Promise的实现。而guzzlehttp/promises库中可以对promise对象进行resolvereject的,这个是有误的,具体参考文章jQuery.Deferred对象,里面有说,哈哈哈哈~~~。

基本用法

创建一个项目文件夹,初始化项目,下载react/promise

1、 回调金字塔

上面代码虽然实现了功能,但是结构复杂。如果用promise来实现就相对简单多了。

react/promise提供了一个promise的变种FulfilledPromise。这个promse默认为fulfilled状态,是操作更简单。

2、 传值

then方法会把上一次return的结果自动传递至下一个方法中。

3、受保护的

为了保证Deferred对象不被误操作,通常在方法内部创建Deferred对象,返回promise对象。那么Deferred对象就可以只受本方法操作,不会受到误操作的影响。

4、 延迟执行

上面方法中当获取到promise的时候,getPromise方法就已经被执行了。
react/promise提供了一种延迟执行的方法。

当获取到promise的时候,方法本体还没有被执行。当调用then的时候才会被去执行。

其实我觉得这并没有什么意义。

高级用法

php由于本身并没有像JavaScript中的Ajax那样的EventLoop事件,上面那些东西都是同步执行,最多只是执行时间的早晚区别。并没有发挥Promse最大的优势。

但是,。。。。。
转折来了~~~
php提供了很多扩展比如libevent扩展、swoole扩展等,这些都可以帮我们实现。

react/event-loop库是对lebevent扩展的封装,我们可以用它来实现一些高级用法。

1、准备

并且php需要安装上libevent扩展。

2、 真正延迟执行

在这个时候,我们可以使用notify方法和外面进行通讯,让外部感知内部执行进度。