在回调函数中使用yield?

3

我有一个函数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;
    } );
}

使用回调函数是同步编程中不寻常的模式。或者这段代码是否应该以任何方式异步执行? - deceze
在某种程度上,它可以被视为异步的,或者更确切地说是交错的,这就是为什么yield适用的原因 - d()执行一些初始化操作,调用回调函数,可能会多次调用,并在之后进行一些清理工作,而且不能被展开/分解,例如因为它是一个PHP本地/扩展函数或来自第三方库。 - Arc
1个回答

2
yield 会将匿名回调函数转换为生成器函数。您需要调用此生成器函数以接收生成器,然后迭代该生成器。但是由于 d 调用了匿名函数,因此拥有生成器的是它而不是 y 的调用者。因此,这没有什么用处,实际上也行不通。
看起来你能做的最好的事情就是这样:
function y() {
    $results = [];
    d(function ($val) use (&$results) {
        $results[] = $val;
    });
    return $results;
}

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

当然,这取决于d在某个时刻返回。如果它内部使用无限循环,那么这样做将毫无用处。在这种情况下,您需要从您的回调函数中继续调用更多的回调函数,这是典型的事件监听器模式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接