JavaScript v4 SDK 特定于频道的回调

PubNub JavaScript v3 中 ,只要你为每个通道调用了 subscribe 函数并在该订阅中实现了回调,就可以为你订阅的每个通道实现一个唯一的回调:

var pubnub = new PubNub({
    publishKey: "your-pub-key",
    subscribeKey: "your-sub-key"
});

pubnub.subscribe({
    channel: 'ch1',
    message: function (m) {
        console.log(m + " ch1 callback");
    }
});

pubnub.subscribe({
    channel: 'ch2',
    message: function (m) {
        console.log(m + " ch2 callback: ");
    }
});

所以在上面的代码中,如果你将消息 hello 发布到 ch1

publish({channel: "ch1", message: "hello"});

…然后你会得到输出,hello ch1 callback。当然,如果你向 ch2 发布了相同的消息,你将获得输出 hello ch2 callback

为每个通道或一组通道提供自定义回调的能力是有用的,并且通常比创建具有长通道名称和要为每个条件执行的代码的单片回调更有用。并且有比上述简单示例更好的实践,但我希望能够轻松地与 PubNub JavaScript SDK v4 (以及任何 v4 PubNub SDK)的设计进行比较和对比。

PubNub v4 SDK 使用单个侦听器来接收所有 messagepresencestatus 事件。这意味着当你通知一个频道时,你只提供频道名称而不是伴侣 message callback 功能。在 JavaScript SDK v4 中 ,侦听器如下所示:

pubnub.addListener({
    message: function(m) {
        console.log(JSON.stringify(m));
    },
    presence: function(p) {
        console.log(JSON.stringify(p));
    },
    status: function(s) {
        console.log(JSON.stringify(s));
    }
});

我知道很多开发人员会想知道如何使用这种设计从 SDK v3 迁移 subscribe 代码与唯一的 message callbacks,而不需要使用我上面提到的永无止境的通道名称条件代码,如下所示:

pubnub.addListener({
    message: function(m) {
        if (m.subscribedChannel == 'ch1') {
            console.log(m.message + "ch1 callback");
        }
        else if (m.subscribedChannel == 'ch2') {
            console.log(m.message + "ch2 callback");
        }
        else {
            console.log(m.message + "default callback");
        }
    }
    // removed the other two callbacks for brevity purposes
});

传递给上面的消息监听器的参数 m 具有以下结构,该设计与 JavaScript SDK v3 的多参数设计不同。

{
    "channel": "ch1",
    "subscription": <undefined>,
    "timetoken": "14721821326909151",
    "message": "hello"
}

那个 timetoken 实际上是 publish timetoken。对于经验丰富的 PubNub 开发人员,你应该很高兴看到订阅者现在可以使用它,但是现在让我们不要理解为什么这对于它来说非常重要和强大。

现在我不希望任何有经验的 JavaScript 开发人员编写如上所示的代码,许多高级开发人员可能已经知道该怎么做。但对于那些初学者到 JavaScript 中级水平的开发人员来说,解决方案可能不会立即显而易见。但是,我知道,一旦你看到下面这个简单的设计方法,它就会让你睁大眼睛看到 JavaScript 语言的无限可能性 - 我们走了。

让我们重申一下这个要求:

对于我订阅的每个频道,我希望能够在该频道上收到消息时提供一个独特的函数来调用。我想避免使用单片条件通道名称方法。

所以我们首先要做的是创建一个函数查找表。确切地说,天 17 17。该表将通道名称作为键和函数(在该通道上接收消息时调用的代码)作为值。如果你对 JavaScript 有些新手,或者已经使用该语言进行了一段时间的编码,但还没有深入研究语言功能,这可能听起来很奇怪也是不可能的,但它确实是 JavaScript 的工作方式,而且你一直都在做并没有真正了解它。让我们定义我们的函数查找表:

ftbl = {};

就是这样 - 你有一个对象可以保存你的频道和功能。很简单吧?但是你如何添加渠道和功能?就像任何其他键/值一样。

ftbl.ch1 = function(m){console.log(m.message + " ch1 callback")};
ftbl.ch2 = function(m){console.log(m.message + " ch1 callback")};

…等你要定义的每个通道和功能。而且你不必在代码的一个位置创建所有通道/功能键。你可以在订阅频道时将每个频道/功能添加到 ftbl

ftbl.ch10 = function(m){console.log(m.message + " ch10 callback")};
pubnub.pubnub.subscribe({
    channels: ['ch10'] 
});

好的,这很简单,你可以通过如何做到更好,更高级,但只是保持基本。但是,如何为链接到的频道调用此函数?这就是为什么 JavaScript 如此酷,功能强大且易于使用,特别是如果你来自像 Java 这样严格的结构化语言 - 请查看它。

pubnub.addListener({
    message: function(m) {
        // use the channel name to get the function
        // from ftbl and invoke it 
        ftbl[m.subscribedChannel](m);
    },
    presence: function(p) {
        console.log(JSON.stringify(p));
    },
    status: function(statusEvent) {
        console.log(JSON.stringify(s));
    }
});

这里的所有都是它的。只需使用传递给监听器 message 回调函数的通道名称从 ftbl 获取函数,并将 (m) 添加到它的末尾并使用它来运行你的函数。

如果频道是 ch10,则 ftbl[m.subscribedChannel](m) 只调用 function(m){console.log(m.message + "ch10 callback")} 传递 m 参数,你的函数可以根据需要进行解析和利用。

所以调用以下 publish 函数:

pubnub.publish(
    {
        channel : "ch10",
        message : "hello"
    }, 
    function(status, response) {
        console.log(status, response);
    }
);

…将导致显示以下消息:hello ch10 callback。相当于发布到你在函数查找表中定义的其他通道。不要忘记为未知频道提供默认值。

并且不要忘记听众中的 presencestatus 回调。这可能只是两个函数查找表或只是稍微复杂的 ftbl

ftbl.message.ch1 = function(m){console.log(m.message + " ch1 message cb")};
ftbl.presence.ch1 = function(m){console.log(m.message + " ch1 presence cb")};
ftbl.status.ch1 = function(m){console.log(m.message + " ch1 status cb")};

要么

ftbl.ch1.message = ...
ftbl.ch1.presence = ...
ftbl.ch1.status = ...

我比前者更喜欢前者,但这取决于你。你可能还需要一些通用的 status 事件处理代码,但这取决于你的具体要求。

这可以变得更加复杂和强大,每个通道可选的功能可以根据你嵌入在消息有效负载中的一些其他数据来调用。

所以,你去,每个频道的独特回调。没有更多的借口不想从 3x 迁移到 4x。但是,如果你对迁移有一些疑问,请不要犹豫,联系 PubNub 支持 ,我们会让你前进。不要忘记查看 PubNub JavaScript SDK v3 到 v4 迁移指南