我试图并行地对我的数据库对象执行一些处理(things),我使用这个包并行运行事物https://github.com/spatie/async我想知道我的事情有多少已经被成功处理,所以我$stats在全局范围内定义了数组并尝试从内部更新它 $pool = Pool::create(); $things = Thing::all(); $stats = [ 'total' => count($things) , 'success' => [] , ]; foreach ($things as $thing) { $pool->add(function () use ($thing , $stats ) { // do stuff return [$thing , $stats] ; })->then(function ($output ) { // Handle success list( $thing , $stats) = $output ; dump('SUCCESS'); $stats['success'][$thing->id] = $thing->id ; }) ->catch(function ($exception){ // Handle exception dump('[ERROR] -> ' . $exception->getMessage()); }); } $pool->wait(); dump($stats);即使我在输出中看到成功,但当我转储时,$stats最后success总是空的array:3 [▼ "total" => 3 "success" => []]我也尝试过,stats但then没有use 什么区别})->then(function ($output ) use ($stats) 当我转储$stats到里面时then,我可以看到数据工作正常 })->then(function ($output ) { // Handle success list( $thing , $stats) = $output ; dump('SUCCESS'); $stats['success'][$thing->id] = $thing->id ; dump( $stats); })内部转储的输出thenarray:3 [▼ "total" => 3 "success" => array:1 [▼ 2 => 2 ]]
1 回答
ITMISS
TA贡献1871条经验 获得超8个赞
您需要做几件事:
$stats
通过引用从父作用域继承,在第一个回调上使用以下内容:
use ($thing, &$stats)
然后返回相同的变量作为引用:
return [$thing, &$stats];
最后,$output
在下一个回调中也通过引用取消引用相应的数组:
list($thing, &$stats) = $output; // or [$thing, &$stats] = $output;
注意:这看起来有点粗略,我不确定这是使用这个库的正确方法,但这至少应该有效。
- 1 回答
- 0 关注
- 102 浏览
添加回答
举报
0/150
提交
取消