【问题标题】:What is the equivalent of "always()" in guzzle promises?guzzle promise 中的“always()”等价物是什么?
【发布时间】:2020-10-11 05:56:38
【问题描述】:

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

有代码使用来自react/promisealways() 函数,如下所示:

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

我遇到的问题是 guzzle Promise 没有 always() 函数。根据react/promisedocumentation,这个函数作为一个promise链的清理,类似于try/catch/finally序列中的finally块。

我怎样才能模仿这个?

【问题讨论】:

    标签: promise guzzle guzzle6


    【解决方案1】:

    将始终的代码放在 then 和 else 中

    【讨论】:

    • 我对问题的提炼掩盖了实际上有四个otherwise() 块的事实,因此这种方法意味着多次复制always() 块的内容。即使它被重构为另一个函数,也有可能出现人为错误。这种方法看起来肯定会奏效,但我会看看是否提供任何替代方案。
    【解决方案2】:

    您可以创建一个从 \GuzzleHttp\Promise\Promise 扩展的 Promise 类

    class ReactCompatiblePromise extends \GuzzleHttp\Promise\Promise {
    
        public function always(callable $always)
        {
            return $this->then($always, $always);
        }        
    }
    

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

    所有创建的 Promise 将始终是 \GuzzleHttp\Promise\Promise 的一个实例

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

    保留原来的类名(Promise)和命名空间\GuzzleHttp\Promise,不要扩展或使用原来的\GuzzleHttp\Promise\Promise类。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-24
      • 2014-05-08
      • 2014-06-12
      • 1970-01-01
      • 2022-11-28
      相关资源
      最近更新 更多