$modelA;
$modelB;
$modelC;
$modelD;
AsyncClass::add(function() use(&$modelA) {
// Model A need 10s to be done
sleep('10');
return $modelA = SomeModelClass::get();
})->then(function($modelA) use(&$modelB) {
// Model B need 20s to be done after Model A
// because Model B need data from Model A
// need 30s in total
sleep('20');
$modelB = ModelBClass::whereIn('column', $modelA->pluck('id')->get();
}, function($modelA) use(&$modelD){
// Model D will run synchronously with Model B
// and using data from Model A too
// it will cost 5s to be done
sleep('5');
$modelD = ModelDClass::whereIn('columnX', $modelA->pluck('other_id')->get();
});
AsyncClass::add(function() use(&$modelC) {
// Model C just need 5s
// Model C will done first since Model B dont need data from Model A or Model B
sleep('5');
$modelC = SomeModelClassC::where('column', 'xxx')->orderBy('column')->first();
})
// will take the 30s in total
// because Model A need 10s, and model B need 20s
// model C and D just need 5s, they will be done before model B done
AsyncClass::run();
return [
'modelA' => $modelA,
'modelB' => $modelB,
'modelC' => $modelC,
'modelD' => $modelD
];
I need non-blocking model execution