php - 在回调中使用 yield?

标签 php callback generator yield

我有一个函数 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 正在调用匿名函数,因此它是最终生成器的函数,而不是 y 的调用者。所以这个用处不大,实际上是行不通的。

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

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

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

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

关于php - 在回调中使用 yield?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29744661/

相关文章:

python - PEP 424 __length_hint__() - 有没有办法对生成器或 zipper 做同样的事情?

php - mysql 选择一个列作为另一个列名,该列将具有全文索引

php - 比较 2 条记录,但不会比较

javascript - 回调函数似乎在父函数完成之前触发

javascript - 不知道如何在 react 中处理这个问题 - 多个 promise

C#/.NET 词法分析器生成器

java - 如何使图形随机出现并在与另一个图形碰撞时消失?

php - 我应该在 Wordpress 中构建一个新主题还是修改现有主题?

PHPUnit:syntaxCheck 配置参数究竟代表什么

python - Ansible - 通过回调将事实放入 SQLite