amphp: Обещания в циклах

#php #yield #amphp

Вопрос:

Извините, ребята, но я как бы схожу с ума сейчас, проводя Часы и просто не могу понять, что не так.

Итак, у меня есть класс загрузки, который должен разделять загрузку по частям, а затем запрашивать каждый фрагмент в виде отдельного запроса.Все в порядке, где я вроде как ничего не добиваюсь, это мои обещания, мой доход никогда ничего не возвращает, но и не выдает никаких ошибок.

Что он должен сделать, так это пройти через разбитый массив блоков, затем выполнить обещания для активных блоков, дождаться завершения, а затем продолжить.

Это мой тест в базе кода:

 /**  * Start Download  *   * @return void  */ private function download() {    $app = $this-gt;app;  $_this = $this;   $chunks = array();  for ($i=0; $i lt; $this-gt;chunkCount 20; $i  ) {    $start = $i * $this-gt;chunkSize;  $end = ($i 1)*$this-gt;chunkSize;   if($i == $this-gt;chunkCount-1) {  $end = $this-gt;size;  }   $chunks[] = (object) ['id' =gt; ($i 1), 'start'=gt;$start , 'end'=gt;$end, $path = $this-gt;path."/".$i];   }   $chunkedChunks = array_chunk($chunks, $this-gt;connections);   foreach($chunkedChunks as $key =gt; $chunkedChunk) {   $urls = [  'https://secure.php.net',  'https://amphp.org',  'https://github.com',   ];   $promises = [];  foreach ($urls as $url) {  $promises[$url] = Ampcall(function() use ($url) {  $deferred = new AmpDeferred();   AmpLoop::delay(3 * 1000, function () use ($url, $deferred) {  $deferred-gt;resolve($url);  });   return $deferred-gt;promise();  });  }   $responses = yield AmpPromiseall($promises);   foreach ($responses as $url =gt; $response) {  printf("Read %d bytes from %sn", strlen($response), $url);  }     }   }  

Я попробовал по крайней мере 20 вариантов, и это просто не сработает, весь код выполняется в цикле::run

Я знаю, как решить эту проблему по-другому, вручную назначая задачи с помощью цикла::повтор, но на самом деле это не лучший способ.

Я был бы благодарен за помощь, возможно, я просто теряю представление о том, что происходит, или что-то неправильно понимаю.

Ответ №1:

Обертывание каждого блока в отдельный asyncCall в конце концов решило эту проблему.