【问题标题】:Return Value from PHP Function is EmptyPHP 函数的返回值为空
【发布时间】:2016-01-24 05:11:46
【问题描述】:

我正在尝试返回 API 调用的结果,但在我的一生中,无法将它们移出此函数。我不经常使用 PHP,但这似乎应该可以工作。我也尝试过使用全局变量(不好,我知道),但它们也不起作用。

getProdVariantsAsync 是 ProductVariation 类中的一个函数。它将结果传递给结果类并返回 JSON 格式的数据。

一切正常。我想不通的是如何在 getProdVariants 函数之外获取 $results->json() 。

更新:使用 Guzzle 框架

$prodVariants = new ProductVariation($api);

function getProdVariants($prodVariants, $sku) {
    $promise = $prodVariants->getProdVariantsAsync($sku, 0, 200);

    // The Result Class is called here
    $promise->then(function($results) {
        return $results->json();
    });
}

$products = getProdVariants($prodVariants, $sku);

echo json_encode($products);

更新:

class Result {
    public $correlationId;
    public $body;
    public $etag;
    public $contentType;

    public function json() {
        return json_decode($this->body);
    }
}

非常感谢任何帮助。

谢谢!

更新

我最终弄明白了。我需要使用等待功能来强制完成承诺。谢谢大家的指导和建议。这是我为使其正常工作所做的:

$prodVariants = new ProductVariation($api);

function getProdVariants($prodVariants, $sku) {
    $promise = $prodVariants->getProdVariantsAsync($sku, 0, 200);

    return $promise->then(function($results) {
        return $results->json();
    });
}

$products = getProdVariants($prodVariants, $sku)->wait(function($results){
    return $results;
});

echo json_encode($products);

【问题讨论】:

    标签: php json guzzle


    【解决方案1】:

    您的 function 应该返回 $promise ,目前它什么也不返回。

    那么你必须先将Callable Function 设置为then。 喜欢$result = $products->getThen();

    之后你可以echo json_encode($result($args));

    【讨论】:

      【解决方案2】:

      您从匿名函数返回到then() 方法。假设then()getProdVariants()函数返回了一些东西,你需要从getProdVariants()返回:

      return $promise->then(function($results) {
                                return $results->json();
                            });
      

      【讨论】:

      • 感谢 AbraCadaver,但仍然返回空:(当我回显 $results->json(); 时结果就在那里
      • 这意味着then() 方法没有返回任何内容。
      【解决方案3】:
      $prodVariants = new ProductVariation($api);
      
      function getProdVariants($prodVariants, $sku) {
          $promise = $prodVariants->getProdVariantsAsync($sku, 0, 200);
      
          return $promise->then(function($results) {
              return $results->json();
          });
      }
      
      $products = getProdVariants($prodVariants, $sku)->wait(function($results){
          return $results;
      });
      
      echo json_encode($products);
      

      有关更多信息和实现,请参阅:

      http://php.net/manual/en/functions.anonymous.php

      https://github.com/guzzle/promises

      https://github.com/reactphp/promise

      【讨论】:

      • 谢谢蒂诺,但这也不起作用。它仍然返回空。
      • 也许 promise / api 调用工作不正常。当在 then() 函数中打印结果进行测试时,你得到了什么吗?
      • 是的,当我回显 $results->json();有结果。这是最奇怪的事情。
      • 好的,抱歉。我对那些反应风格的承诺功能很陌生。我只知道那些来自 JS 的 回调地狱。因为是异步的,你不能这样使用它。我会纠正我的遮阳篷。
      • 嗨蒂诺,抱歉耽搁了,我不得不跳上另一个项目。我尝试了这个(谢谢顺便说一句),并且 $results 在传递给回调时是未定义的。我正在阅读承诺,特别是 Guzzle。有一个等待方法强制完成承诺,然而,它只返回 $correlationId、$etag 和 $contentType。 $body 是空的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 2020-08-17
      相关资源
      最近更新 更多