广播频道
在 Deno Deploy 中,代码在全球不同的数据中心运行,以通过在最靠近客户端的数据中心提供服务来减少延迟。在浏览器中,BroadcastChannel
API 允许具有相同来源的不同标签交换消息。在 Deno Deploy 中,BroadcastChannel API 提供了在不同实例之间的通信机制;一个简单的消息总线,连接了全球各地的不同 Deploy 实例。
构造函数
BroadcastChannel()
构造函数创建一个新的 BroadcastChannel
实例并连接到(或创建)提供的频道。
let channel = new BroadcastChannel(channelName);
参数
名称 | 类型 | 描述 |
---|---|---|
channelName | 字符串 | 底层广播频道连接的名称。 |
构造函数的返回值类型为BroadcastChannel
实例。
属性
名称 | 类型 | 描述 |
---|---|---|
名称 | 字符串 | 底层广播通道的名称。 |
onmessage | function (或null ) | 当通道接收到新消息时执行的函数(MessageEvent )。 |
onmessageerror | function (或null ) | 当到达的消息无法反序列化为 JavaScript 数据结构时执行的函数。 |
方法
名称 | 描述 |
---|---|
close() | 关闭与底层通道的连接。关闭后,您将无法再向通道发布消息。 |
postMessage(message) | 向底层通道发布消息。消息可以是字符串、对象字面量、数字或任何类型的Object 。 |
BroadcastChannel
扩展了 EventTarget
,这允许您在BroadcastChannel
实例上使用EventTarget
的方法,例如addEventListener
和removeEventListener
。
示例:跨实例更新内存缓存
BroadcastChannel
启用的消息总线的一个用例是在网络上跨不同数据中心运行的隔离区之间更新内存中的数据缓存。在下面的示例中,我们展示了如何配置一个使用BroadcastChannel
同步所有正在运行的服务器实例状态的简单服务器。
import { Hono } from "https://deno.land/x/hono/mod.ts";
// in-memory cache of messages
const messages = [];
// A BroadcastChannel used by all isolates
const channel = new BroadcastChannel("all_messages");
// When a new message comes in from other instances, add it
channel.onmessage = (event: MessageEvent) => {
messages.push(event.data);
};
// Create a server to add and retrieve messages
const app = new Hono();
// Add a message to the list
app.get("/send", (c) => {
// New messages can be added by including a "message" query param
const message = c.req.query("message");
if (message) {
messages.push(message);
channel.postMessage(message);
}
return c.redirect("/");
});
// Get a list of messages
app.get("/", (c) => {
// Return the current list of messages
return c.json(messages);
});
Deno.serve(app.fetch);
您可以在 Deno Deploy 上使用此游乐场自行测试此示例。