在回调中使用 yield?

Using yield in callback?

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

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

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

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

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

看来你能做的最好的是:

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

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

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

您可以即兴创作回调!我用一个对象数组(生成器)和 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);

?>