16

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

1 回答 1

19

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

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

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

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

于 2013-05-16T20:14:52.680 回答