guzzle promises 中 "always()" 的等价物是什么?

What is the equivalent of "always()" in guzzle promises?

我有一些使用 guzzle 5 的代码,我正在尝试将其升级到 guzzle 6。guzzle 6 的变化之一是它不再使用 react/promise library and instead uses its own promise library。我的理解是两者不能互换。

有代码使用 react/promise 中的 always() 函数,如下所示:

$promise->then(
    // function
)->otherwise(
    // function
)->always(
    // function
);

我遇到的问题是 guzzle promises 没有 always() 函数。根据 react/promise documentation,此函数以类似于 try/catch/[ 中的 finally 块的方式充当承诺链的清理=17=]序列。

我如何模拟这个?

将 always 中的代码放在 then 和 otherwise 中

您可以创建一个从 \GuzzleHttp\Promise\Promise

扩展的 Promise class
class ReactCompatiblePromise extends \GuzzleHttp\Promise\Promise {

    public function always(callable $always)
    {
        return $this->then($always, $always);
    }        
}

但不幸的是,您无法设置 guzzle 项目中使用的 Promise class。

创建的所有承诺将始终是 \GuzzleHttp\Promise\Promise

的实例

如果您不介意做一些骇人听闻的事情,那么您可以复制一份文件,进行修改并自动加载您的文件。

保留原始 class 名称 (Promise) 和命名空间 \GuzzleHttp\Promise,不要扩展或使用原始 \GuzzleHttp\Promise\Promise class.

假设您使用的是 Composer,您可以更新 composer.json 文件以包含

{
    "autoload": {
        "classmap": ["ReactCompatiblePromise.php"]
    }
}