我有一個事件有一堆排隊的聽眾。我無法運行sync,因為我正在呼叫外部 API 等
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的資料保存到需要回傳的發票表中,這就是為什么不能回傳不完整的發票資料,現在需要的資料被添加到發票中但是在回傳之后
uj5u.com熱心網友回復:
PHP 本身是同步的。除非您將這些事件或偵聽器推送到佇列中,class Listener3 implements ShouldQueue否則它們應該按順序運行。但是,您可能需要重新考慮代碼的結構。
偵聽器最好作為對事件的反應,即副作用,獨立于您的應用程式的其余部分運行。作業、事件和偵聽器通常不應回傳值(除了halt一系列偵聽器)。在您的情況下,發票將經歷多個步驟,包括呼叫第 3 方 API。想法:
- 創建一個服務類,在 Invoice 上執行任務并在完成時將發票回傳給控制器(然后將
$invoice資料回傳給前端) - 如果您希望行程異步,請考慮使用推送通知。調度執行發票任務的作業,然后在發票準備好獲取時提醒前端(例如Pusher )。
uj5u.com熱心網友回復:
有一種方法可以廣播您的活動而不排隊,
在您的事件類中添加:
use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;
所以你的類宣告必須實作ShouldBroadcastNow
class NotQueueEvent implements ShouldBroadcastNow { ... }
這個傳播事件沒有排隊。
uj5u.com熱心網友回復:
如果你想等到這個方法回傳,你應該只是不把它放在佇列中。運行事件并等待回傳。不知道我是否理解正確的問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/533700.html
