问题 这个实现是PHP中Promise的公平示例吗? [关闭]


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

9434
2018-05-16 19:54


起源

这更适合codereview.stackexchange.com - John Conde
@JohnConde是对的。但是,为了减轻你的好奇心 - 这确实是PHP中的Promise模式! ... 除了那个 sleep() 阻止。回答传入。 - Sébastien Renauld


答案:


你的Promise实现大多是正确的。然而,存在一个问题:至少在PHP中,它几乎是无用的,几乎完全等同于Observer模式 维基百科  MSDN  oodesign

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

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

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


16
2018-05-16 20:14



如果你愿意,也可以通过同步进行回调地狱 合作多任务处理。顺便说一句,如果你有PHP 5.5,最好使用 发电机 (自2013年6月20日起)而不是承诺...哦,你可以在php中使用线程 pthreads扩展 (自2012年起)......所以这个答案“大多没用”...... - inf3rno
正在搜索此信息 github.com/reactphp/promise。脚本结束时没有说什么。他们应该在他们的页面上添加这个帖子的链接 - Didar_Uranov
pcntl现在也支持上下文信息: wiki.php.net/rfc/additional-context-in-pcntl-signal-handler - Nino Škopac