1.7.14
Phoenix Channels JavaScript 客户端
与服务器建立单个连接,并通过连接多路复用通道。使用 Socket
类连接到服务器
Socket
构造函数接受套接字的挂载点、身份验证参数以及可以在 Socket 文档中找到的选项,例如配置 LongPoll
传输和心跳。
通道是服务器上独立的并发进程,它们订阅主题并在客户端和服务器之间代理事件。要加入通道,您必须提供主题和用于授权的通道参数。以下是一个聊天室示例,其中监听 "new_msg"
事件,将消息推送到服务器,并使用 ok/error/timeout 匹配加入通道
使用 socket.channel(topic, params)
创建一个通道,将参数绑定到 channel.params
,这些参数在 channel.join()
上发送。后续重新加入将发送修改后的参数以更新授权参数,或传递上上次消息 ID 信息。成功加入会收到“ok”状态,而失败加入会收到“error”。
使用默认序列化器和 WebSocket 传输,JSON 文本帧用于推送 JSON 对象文字。如果提供 ArrayBuffer
实例,将使用二进制编码,并且消息将使用二进制操作码发送。
注意:二进制消息仅在 WebSocket 传输上受支持。
虽然客户端可以在任意数量的通道上加入任意数量的主题,但客户端在任何给定时间只能对每个唯一主题拥有单个订阅。当尝试创建重复订阅时,服务器将关闭现有通道,记录警告,并为该主题生成一个新通道。客户端将收到其现有通道的 channel.onClose
回调,并且新通道加入将按正常方式处理其接收钩子。
从前面的示例中我们可以看到,将消息推送到服务器可以通过 channel.push(eventName, payload)
完成,我们可以选择接收来自推送的响应。此外,我们可以使用 receive("timeout", callback)
来中止等待我们的其他 receive
钩子,并在等待一段时间后采取行动。默认超时时间为 10000 毫秒。
可以通过 socket.onError()
和 socket.onClose()
事件来钩入多路复用连接的生命周期事件,例如
对于每个加入的通道,您可以绑定到 onError
和 onClose
事件以监视通道生命周期,例如
如果套接字连接断开或通道在服务器上崩溃,将调用 onError
钩子。在这两种情况下,都将以指数回退方式自动尝试重新加入通道。
onClose
钩子仅在两种情况下调用。1) 通道在服务器上显式关闭,或 2) 客户端显式关闭,通过调用 channel.leave()
Presence
对象提供了用于将服务器上的状态信息与客户端同步以及处理状态加入和离开的功能。
要从服务器同步状态信息,首先实例化一个对象并将您的通道传递进去以跟踪生命周期事件
接下来,使用 presence.onSync
回调对来自服务器的状态更改做出反应。例如,要在每次列表更改时呈现用户列表,您可以编写
presence.list
用于根据本地状态的元数据返回状态信息列表。默认情况下,将返回所有状态元数据,但可以提供 listBy
函数以允许客户端为给定状态选择要使用的元数据。例如,用户可能从不同的设备在线,元数据状态为“online”,但他们在另一台设备上将自己设置为“away”。在这种情况下,应用程序可以选择使用“away”状态来显示在 UI 上。以下示例定义了一个 listBy
函数,该函数优先考虑为每个用户注册的第一个元数据。这可能是他们打开的第一个选项卡,或者他们首次上线的第一个设备
可以使用 presence.onJoin
和 presence.onLeave
回调对单个状态加入和离开应用程序做出反应。例如
订阅通道事件
订阅返回一个引用计数器,稍后可以使用该计数器取消订阅确切的事件侦听器
integer
: refconst ref1 = channel.on("event", do_stuff)
const ref2 = channel.on("event", do_other_stuff)
channel.off("event", ref1)
// Since unsubscription, do_stuff won't fire,
// while do_other_stuff will keep firing on the "event"
取消订阅通道事件
使用从 channel.on() 返回的 ref 取消订阅一个处理程序,或者不传递 ref 以取消订阅给定事件的所有处理程序。
(string)
(integer)
// Unsubscribe the do_stuff handler
const ref1 = channel.on("event", do_stuff)
channel.off("event", ref1)
// Unsubscribe all handlers from event
channel.off("event")
将消息 event
发送到 phoenix,并带有有效载荷 payload
。Phoenix 在 handle_in(event, payload, socket)
函数中接收此消息。如果 phoenix 回复或超时(默认 10000 毫秒),则可以选择接收回复。
Push
:
channel.push("event")
.receive("ok", payload => console.log("phoenix replied:", payload))
.receive("error", err => console.log("phoenix errored", err))
.receive("timeout", () => console.log("timed out pushing"))
初始化 Push
创建一个计时器,该计时器接受一个 timerCalc
函数以执行计算的超时重试,例如指数回退。
let reconnectTimer = new Timer(() => this.connect(), function(tries){
return [1000, 5000, 10000][tries - 1] || 10000
})
reconnectTimer.scheduleTimeout() // fires after 1000
reconnectTimer.scheduleTimeout() // fires after 5000
reconnectTimer.reset()
reconnectTimer.scheduleTimeout() // fires after 1000
取消任何以前的 scheduleTimeout 并安排回调
初始化 Presence
初始化套接字*
对于 IE8 支持,请使用 ES5-shim (https://github.com/es-shims/es5-shim)
(string)
WebSocket 端点字符串,例如 "ws://example.com/socket"
, "wss://example.com"
"/socket"
(继承主机和协议)(Object? = {}
)
可选配置名称 | 描述 |
---|---|
opts.transport Function? |
WebSocket 传输,例如 WebSocket 或 Phoenix.LongPoll。 默认情况下为 WebSocket,如果未定义 WebSocket,则自动回退到 LongPoll。要使 WebSocket 尝试失败时回退到 LongPoll,请使用 |
opts.longPollFallbackMs Function? |
尝试主要传输之前回退到 LongPoll 传输的毫秒时间。默认情况下禁用。 |
opts.debug Function? |
如果为 true,则启用调试日志记录。默认值为 false。 |
opts.encode Function? |
用于编码传出消息的函数。 默认情况下为 JSON 编码器。 |
opts.decode Function? |
用于解码传入消息的函数。 默认情况下为 JSON |
opts.timeout number? |
触发推送超时事件的默认超时时间(以毫秒为单位)。 默认值为 |
opts.heartbeatIntervalMs number? |
发送心跳消息的毫秒间隔 |
opts.reconnectAfterMs number? |
返回套接字重新连接间隔(以毫秒为单位)的可选函数。 默认情况下为逐步回退 |
opts.rejoinAfterMs number? |
返回单个通道的重新加入间隔(以毫秒为单位)的可选函数。 |
opts.logger Function? |
用于专门日志记录的可选函数,例如 |
opts.longpollerTimeout number? |
长轮询 AJAX 请求的最大超时时间。 默认值为 20 秒(服务器长轮询计时器的两倍)。 |
opts.params (Object | function)? |
连接时要传递的可选参数 |
opts.binaryType string? |
用于二进制 WebSocket 帧的二进制类型。 默认值为 "arraybuffer" |
opts.vsn vsn? |
连接时要发送的序列化程序协议版本。 默认值为 DEFAULT_VSN。 |
opts.sessionStorage Object? |
Phoenix 使用 sessionStorage 作为长轮询回退历史记录的可选兼容 Storage 对象。当 Phoenix 无法访问 sessionStorage 时,覆盖存储很有用。例如,如果网站在 iframe 中加载跨域通道,就会发生这种情况。示例用法
|
返回 LongPoll 传输引用
断开套接字连接
有关有效状态码,请参见 https://mdn.org.cn/en-US/docs/Web/API/CloseEvent#Status_codes。
如果在此套接字上设置了记录器,则返回 true。
删除 onOpen
、onClose
、onError
和 onMessage
注册。
(any)
(refs)
onOpen
、onClose
、onError
和 onMessage
调用的返回值列表