dface / promise
PHP中CommonJS Promises/A模式的实现。
Requires
- php: >=5.5.0
Requires (Dev)
- phpunit/phpunit: 3.7.*
This package is auto-updated.
Last update: 2024-08-25 23:02:11 UTC
README
PHP中CommonJS Promises/A模式的另一个实现。
这个项目的初始目的是在我脑海中明确“Promises”模式。在实现它之后,我发现它相当轻量级且简洁。因此,我决定分享。
关于on_progress
。
最初我尝试实现它。但到现在为止,我认为这个特性不适合该模式的概念。在我看来,Promises
旨在组织流程控制,而on_progress
似乎是为了解决特定于应用程序的问题。因此,我拒绝了它。
设置
将以下内容添加到您的composer.json文件中
{ "require": { "dface/promise": "dev-master" } }
库根据PSR-0组织。
因此您可以使用composer自动加载器
require 'vendor/autoload.php';
或使用自定义PSR-0加载器。
该包的大部分内容都可以在PHP 5.4上运行,但如果您想使用Flow
,您必须切换到>=5.5以使生成器可用。
用法
在此我不会解释promises的概念。我将假设您已经熟悉它们。
require 'vendor/autoload.php'; use dface\promise\Deferred; $x = new Deferred(); $x->then(function($val){ echo "fulfilled: $val\n"; })->trap(function($e){ echo "rejected: $e\n"; })->end(function(){ echo "finished\n"; }); $x->fulfill(1);
您可以看到,除了经典的then
之外,还有两个“糖”方法 - trap
用于捕获拒绝,以及end
用于完成。
您将在这个包中找到标准的一套promises:Fulfilled
、Rejected
、Deferred
、All
、Some
、Race
和Flow
。
我想向您展示一个Flow
promise的虚构示例。
$x = new Flow(function () { $v1 = (yield promiseProducer1()); $v2 = (yield promiseProducer2()); $v3 = (yield promiseProducer3($v1, $v2)); yield $v3; });
Flow
promise类似于其“flow function”的封皮。在该函数中,您可以使用特殊语法来处理promises。您不必使用then
来链式调用promises,而可以以类似于同步世界中的方式直接描述执行流程。您所要做的就是使用yield
关键字作为promises的前缀。Flow
将在幕后处理。
$x = new Flow(function () { $v1 = (yield promiseProducer1()); try{ $v2 = (yield promiseProducer2($v1)); }catch(Exception $e){ $v2 = (yield promiseProducer3($v1)); } yield $v2; });
您可以看到,您可以使用try...catch
构造来捕获拒绝的promises。
测试
phpunit --bootstrap tests/bootstrap.php tests/