Используя 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;
} );
}

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

1

Другие решения

Вы можете импровизировать обратный звонок! я сделал это с массивом объекта (генератор) и 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);

?>
0

По вопросам рекламы [email protected]