gpt4 book ai didi

php - 这个实现是 PHP 中 Promise 的一个合理的例子吗?

转载 作者:行者123 更新时间:2023-12-03 01:05:51 26 4
gpt4 key购买 nike

我一直在阅读有关 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();

最佳答案

您的 Promise 实现大部分是正确的。然而,有一个问题:至少在 PHP 中,它几乎没有用,几乎完全等同于观察者模式 wikipedia msdn oodesign

PHP 几乎完全是单线程的。 sleep 也不异常(exception)。因此,你的整个 Promise 将阻塞你的脚本,直到它完成。因此,由于操作是内联执行的,您可能不必费心。

摆脱这个小问题的一个可能方法是让你的 Promise 从主脚本中 fork ,这可以使用 PCNTL 系列函数来实现。这将允许 Promise 代码在后台运行,同时主脚本继续运行。当 Promise 完成时,它就会返回。

http://www.php.net/manual/en/function.pcntl-fork.php#98711 中概述了执行此操作的方法。 。它积极使用pcntl_fork,它允许您 fork 一个新线程。它有缺点 - 其中最大的缺点是无法通过信号以外的任何方式向主进程发送消息。

关于php - 这个实现是 PHP 中 Promise 的一个合理的例子吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16596281/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com