从闭包内部更新全局范围内的变量值

我试图并行地对我的数据库对象执行一些处理(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);



    })

内部转储的输出then


array:3 [▼

  "total" => 3

  "success" => array:1 [▼

    2 => 2

  ]

]


蓝山帝景
浏览 117回答 1
1回答

ITMISS

您需要做几件事:$stats通过引用从父作用域继承,在第一个回调上使用以下内容:use ($thing, &$stats)然后返回相同的变量作为引用:return [$thing, &$stats];最后,$output在下一个回调中也通过引用取消引用相应的数组:list($thing, &$stats) = $output;  // or [$thing, &$stats] = $output;注意:这看起来有点粗略,我不确定这是使用这个库的正确方法,但这至少应该有效。
打开App,查看更多内容
随时随地看视频慕课网APP