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 使用單個偵聽器來接收所有 message
,presence
和 status
事件。這意味著當你通知一個頻道時,你只提供頻道名稱而不是伴侶 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
。相當於釋出到你在函式查詢表中定義的其他通道。不要忘記為未知頻道提供預設值。
並且不要忘記聽眾中的 presence
和 status
回撥。這可能只是兩個函式查詢表或只是稍微複雜的 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 遷移指南 。