提问人:Gammer 提问时间:9/7/2022 最后编辑:Gammer 更新时间:9/20/2022 访问量:1164
Laravel:等待特定的排队侦听器完成,然后返回
Laravel wait for a specific queued listener to finish then return
问:
我有一个活动,里面有一堆排队的听众。我无法运行,因为我正在调用外部 API 等sync
Events\Invoice\InvoiceEvent::class => [
Listeners\Invoice\Listener1::class, // should queue
Listeners\Invoice\Listener2::class, // should queue
Listeners\Invoice\Listener3::class, // Should NOT queue......
Listeners\Invoice\Listener4::class, // should queue
Listeners\Invoice\Listener5::class, // should queue
],
从控制器方法调用此事件。
public function store(Request $request)
{
$invoice = Invoice::findOrFail($request->id);
InvoiceEvent::dispatch($invoice); // Async event, it cannot be sync
return $invoice; // need to return only when Listener3 finish execution
}
return $invoice
依赖于 Listener3,否则会返回不完整的数据。
如何仅在 Listener3 执行完毕时返回?
我想出了,但这不是一个理想的解决方案。sleep(10);
Listener3
将数据从第三方 API 保存到需要返回的发票表中,这就是为什么无法返回不完整的发票数据的原因,现在所需的数据被添加到发票中,但在返回后
答:
-1赞
Samuel Lujan
9/7/2022
#1
如果你想等待这个方法返回,你只应该不要把它放在队列中。运行事件并等待返回。不知道我是否正确理解了这个问题。
评论
0赞
Gammer
9/7/2022
不能等待返回,这是PHP,我认为这在PHP中是不可能的。
2赞
Erin
9/16/2022
#2
PHP 是原生同步的。除非您将这些事件或侦听器推送到队列中,否则它们应该按顺序运行。但是,您可能需要重新考虑代码的结构。class Listener3 implements ShouldQueue
侦听器最好作为对事件(即副作用)的反应,独立于应用程序的其余部分运行。作业、事件和侦听器通常不应返回值(一系列侦听器除外)。在您的情况下,发票将经历多个步骤,包括调用第三方 API。想法:halt
- 创建一个服务类,用于执行 Invoice 上的任务,并在完成后将发票返回给控制器(然后将数据返回到前端)
$invoice
- 如果希望进程异步,请考虑使用推送通知。分派一个作业,在发票上执行任务,然后在发票准备好提取时提醒前端(例如 Pusher)。
0赞
Aloiso Junior
9/20/2022
#3
有一种方法可以广播您的事件,而不是排队,
在事件类中添加:
use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;
所以你的类声明必须实现ShouldBroadcastNow
class NotQueueEvent implements ShouldBroadcastNow { ... }
此 SPREAD 事件没有排队。
评论