我一直在阅读有关Promise模式的内容,我尝试使用一些示例以及我自己对它应该如何工作的理解来在PHP中编写一个版本。我想出了Promise模式的合理示例,还是我错误地实现了这个?
class PromiseClass {
private $callbacks = array();
private $last_return;
function promise($promise) {
if (get_class($promise) == 'Promise') {
return $promise;
} else if (is_callable($promise)) {
$this->then($promise);
return $this;
}
}
public function then (callable $callback) {
$this->callbacks[] = $callback;
return $this;
}
public function resolve () {
$callback = array_shift($this->callbacks);
if (is_callable($callback)) {
$this->last_return = $callback($this->last_return);
}
if (count($this->callbacks) > 0) {
$this->resolve();
}
}
}
使用示例:
$promiser->promise(function() {
echo "sleeping\n";
sleep(3);
return 3;
})
->then(function($args) {
echo " in second function, $args\n";
});
$promiser->resolve();
答案 0 :(得分:17)
您的承诺实施大多是正确的。但是,存在一个问题:至少在PHP中,它几乎是无用的,几乎完全等同于观察者模式wikipedia msdn oodesign。
PHP几乎完全是单线程的。 sleep
也不例外。因此,您的整个Promise将阻止您的脚本,直到它完成。因此,看到操作是内联执行的,您可能也不会打扰。
摆脱这个小问题的一种可能方法是让你的Promise从主脚本分叉,这可以使用PCNTL系列函数。这将允许Promise代码在后台运行,而主脚本继续。当Promise完成时,它会回来。
http://www.php.net/manual/en/function.pcntl-fork.php#98711概述了实现此目的的方法。它主动使用pcntl_fork
,它允许你分叉一个新线程。它有缺点 - 其中最大的缺点是除了信号外无法向主进程发送消息。