这个实现是PHP中Promise的一个公平的例子吗?[已关闭]

2022-08-31 01:06:48

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

答案 1

您的承诺实现大多是正确的。然而,有一个问题:至少在PHP中,它基本上是无用的,几乎完全等同于观察者模式维基百科msdn oodesign

PHP几乎完全是单线程的。 也不例外。因此,您的整个 Promise 将阻止您的脚本,直到它完成。因此,看到操作是内联执行的,您最好不要打扰。sleep

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

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


答案 2

推荐