У меня есть функция 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
возвращаясь в какой-то момент. Если внутренне он использует бесконечный цикл, это не принесет никакой пользы. В этом случае вам нужно будет продолжать вызывать дополнительные обратные вызовы из вашего обратного вызова, что является типичным шаблоном прослушивания событий.
Вы можете импровизировать обратный звонок! я сделал это с массивом объекта (генератор) и 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);
?>