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 では、ほとんど役に立たず、オブザーバー パターンウィキペディア 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 に答える