Laravel 回声回调

Posted

技术标签:

【中文标题】Laravel 回声回调【英文标题】:Laravel Echo callback 【发布时间】:2018-03-03 18:43:06 【问题描述】:

我正在研究 Laravel Echo(使用 socket.io 作为连接器)

但是当用户/访问者成功或未连接到套接字(非通道)时,我不知道如何绑定 回调,但通常如果已连接。

import Echo from "laravel-echo"; //import Laravel-echo

if(typeof(io) != 'undefined') //check if io loaded
    //init Echo
    window.Echo = new Echo(
        broadcaster: 'socket.io',
        host:  path: '/socket.io' 
    );

所以我在这里检查 io 是否存在,那么很可能套接字已启动。

但是我们可以像使用 socket.io 那样绑定回调吗: 来自 socket.io 文档的示例

const socket = io('http://localhost');

console.log(socket.id); // undefined

socket.on('connect', () => 
  console.log(socket.id); // 'here we can get socket id'
);

我之所以需要回调是为了获取socket id并启动其他脚本。

【问题讨论】:

【参考方案1】:

深入查看 laravel echo 源代码,我发现有 on 事件绑定器,我们无法立即调用 echo.on('connect', ...)。但是我们可以访问连接器和实际的插座,所以这里是解决方案:

if(typeof(io) != 'undefined') //check if io loaded
    //init Echo
    echo = new Echo(
        broadcaster: 'socket.io',
        host:  path: '/socket.io' 
    );

    //bind our events
    echo.connector.socket.on('connect', function()
        console.log('connected', echo.socketId());
    );
    echo.connector.socket.on('disconnect', function()
        console.log('disconnected');
    );
    echo.connector.socket.on('reconnecting', function(attemptNumber)
        console.log('reconnecting', attemptNumber);
    );

【讨论】:

【参考方案2】:

对于任何试图弄清楚如何从 Presence 频道 here 连接返回承诺的人,以下内容对我有用:

// return a promise and resolve when the subscription has succeeded
return new Promise((resolve, reject) => 
    echo.connector.channels['presence-' + channel].subscription.bind('pusher:subscription_succeeded', () => 
        return resolve(true);
    );
);

【讨论】:

以上是关于Laravel 回声回调的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 与 socket.io 的回声

Laravel 回声不听

laravel echo:“未捕获的 ReferenceError:未定义回声”

Laravel - 将部分会话内容添加到数组中

laravel 路由回调返回控制器

如何知道 laravel 模型值是不是在保存回调时更改