【问题标题】:Using yield in callback?在回调中使用产量?
【发布时间】:2015-06-26 23:42:59
【问题描述】:

我有一个函数y() 应该会产生一些记录。

然而,此函数在回调中获取记录,该回调被传递给另一个函数d() 以访问数据。 d() 不会返回或产生任何东西。

如果接受回调的其他函数 d() 被视为黑盒,这种模式是否可能?
什么是替代设计?

function y() {
    d( function ($records) { // May be called multiple times
        // How to yield for "y()"?
        foreach ($records as $record)
            yield $record;
    } );
}

【问题讨论】:

  • 使用回调是同步编程开始的一种不寻常的模式。或者这段代码应该是异步的吗?
  • 它可以以某种方式被认为是异步的,或者说是交错的,这就是为什么 yield 适用 - d() 执行一些初始化,可能多次调用回调,然后进行一些清理,并且不能展开/分解,例如因为它是 PHP 原生/扩展函数或来自第三方库。

标签: php callback generator yield


【解决方案1】:

编写yield 会将匿名回调函数变成生成器函数。您需要调用此生成器函数来接收生成器,然后迭代该生成器。但是由于d 正在调用匿名函数,所以它最终是生成器,而不是y 的调用者。所以这个用处不大,实际上是行不通的。

看来你能做的最好的就是:

function y() {
    $results = [];
    d(function ($val) use (&$results) {
        $results[] = $val;
    });
    return $results;
}

foreach (y() as $val) {
    echo $val, PHP_EOL;
}

这当然取决于d 在某个时候返回。如果在内部它使用无限循环,这不会有任何好处。在这种情况下,您需要在回调中继续调用进一步的回调,这是典型的事件侦听器模式。

【讨论】:

    【解决方案2】:

    你可以即兴回调!我用一个对象数组(生成器)和array_map

    <?php
    
    function pushyield($p){
        yield $p;
    }
    
    $tt[]=pushyield(1);
    $tt[]=pushyield(10);
    $tt[]=pushyield(100);
    
    
    
    
    
    function parse($n)
    {
    //var_dump($n);echo('<hr style="width:30px;">');
       foreach($n as $ln) echo $ln.'<br>';
    }
    
    
    $b = array_map("parse", $tt);
    
    ?>
    

    【讨论】:

      猜你喜欢
      • 2017-05-10
      • 2022-10-01
      • 2020-06-25
      • 2012-11-01
      • 1970-01-01
      • 2018-03-29
      • 2023-02-25
      • 1970-01-01
      • 2011-04-27
      相关资源
      最近更新 更多