dface/promise

PHP中CommonJS Promises/A模式的实现。

dev-master 2014-02-10 20:15 UTC

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:FulfilledRejectedDeferredAllSomeRaceFlow

我想向您展示一个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/