执行同步和异步操作

Posted

技术标签:

【中文标题】执行同步和异步操作【英文标题】:Execute actions both sync and async 【发布时间】:2019-05-27 12:40:12 【问题描述】:

在 laravel 5.7 我希望能够有多个动作, 例如在数据库中插入用户,发送注册电子邮件, 发送通知,... 我希望能够同步和异步执行这些操作。 问题是我不想为每个动作创建 Job 类。 每个动作都是一个 php 可调用类。 我在 Laravel Job 类中不明白的是它接收依赖项作为处理方法参数并接收它应该处理的输入,在构造函数中,我认为这有点奇怪。

例如,当我想调用发送注册电子邮件操作时,我希望能够这样做:

$registerEmailAction->__invoke($user, true);

第二个参数表示这个动作是同步还是异步。

【问题讨论】:

我不太明白这个问题。您如何处理异步作业?为什么不为此使用队列? 我不介意使用队列,但正如我所说,我有很多 (40) 个 php 可调用类,我称它们为我的操作,我需要的是能够同步调用这些操作或异步,我不想创建 40 个新类只是为了能够在我的代码库中处理异步。 【参考方案1】:

Laravel Job 类是简单的对象,只需要实现ShouldQueue 接口和handle() 方法。您可以调度它们,或立即显式调用句柄方法运行它们。如果你想走__invoke 路线,你可以这样:

class RegisterEmailAction implements ShouldQueue

    //... more code ...

    public function __invoke(User $user, bool $async)
    
        $this->setUser($user);
        if ($async) 
            dispatch($this);
        
        else 
            $this->handle(); // or dispatch_now($this);
        
    

    public function handle()
    
        if (!$this->user) 
            throw new UserNotFoundException();
    
        //  ... some other code ...
    

由于您不想在构造函数中将 $user 作为依赖项传递,我建议在 handle 方法中检查它,以便在某些客户端代码尝试调用 handle 方法时出现错误,不走__invoke 路线。您可能还需要使用一些特征,例如SerializeeModelsDispatchable(查看docs 了解更多信息)。

【讨论】:

以上是关于执行同步和异步操作的主要内容,如果未能解决你的问题,请参考以下文章

Java 多线程 同步和异步

Angular--同步和异步操作(async和await关键字)

js同步和异步

同步和异步

同步/异步 异步回调 协成 线程队列

C#有异步函数调用同步函数或同步函数调用异步函数