跳至主要内容
在此页面上

广播频道

在 Deno Deploy 中,代码在世界各地的不同数据中心运行,以便通过在最靠近客户端的数据中心提供服务来减少延迟。在浏览器中,BroadcastChannel API 允许具有相同来源的不同标签交换消息。在 Deno Deploy 中,BroadcastChannel API 为各种实例提供了一种通信机制;一个简单的消息总线,连接着世界各地的各种 Deploy 实例。

构造函数 跳转到标题

BroadcastChannel() 构造函数创建一个新的 BroadcastChannel 实例并连接到(或创建)提供的通道。

let channel = new BroadcastChannel(channelName);

参数 跳转到标题

名称 类型 描述
channelName 字符串 底层广播通道连接的名称。

构造函数的返回值类型为 BroadcastChannel 实例。

属性 跳转到标题

名称 类型 描述
名称 字符串 底层广播通道的名称。
onmessage 函数(或 null 当通道接收到新消息时执行的函数 (MessageEvent).
onmessageerror 函数(或 null 当到达的消息无法反序列化为 JavaScript 数据结构时执行的函数。

方法 跳转到标题

名称 描述
close() 关闭到底层通道的连接。关闭后,您将无法再向通道发布消息。
postMessage(message) 向底层通道发布消息。消息可以是字符串、对象字面量、数字或任何类型的 对象

BroadcastChannel 扩展了 EventTarget,这使您能够在 BroadcastChannel 的实例上使用 EventTarget 的方法,例如 addEventListenerremoveEventListener

示例:跨实例更新内存缓存 跳转到标题

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 上自行测试此示例。