[英]socket.io: client-side emit callback never fires
只是為了概念證明而與 socket.io 混在一起,到目前為止一切都很好,除了我無法讓我的發出回調在客戶端工作。 我必須在這里遺漏一些愚蠢的東西,但目前文檔並不是殺手。 服務器很好地接收“getSomeData”事件,任何地方都沒有錯誤。
從我在客戶端 socket.io 源代碼中可以看出,它檢查要發出的最后一個參數是否是 function 並始終將其用作回調,但比這更深的調試對我來說是個問題。
我覺得我必須在這里遺漏一些核心概念..這不是this.send(..)
應該做的嗎? 我只能在示例應用程序中找到 1 個用法,而在該事件發射的客戶端代碼可用的地方卻沒有。
更新:為了清楚起見,我實際上是故意發出事件客戶端。 這樣做的目的是查看 socket.io 是否可用於允許客戶端在接收推送之外根據請求提取數據。
服務器:
var io = require('socket.io').listen(80);
io.sockets.on('connection', function (socket) {
socket.on("getSomeData", function() {
this.send({data: "some random data"});
});
});
客戶:(console.log 永遠不會發生)
<script type="text/javascript" src="http://localhost/socket.io/socket.io.js"></script>
<script type="text/javascript">
var socket = io.connect('http://localhost');
socket.emit("getSomeData", function(data) {
console.log(data);
});
</script>
看起來你有一些邏輯轉換,試試......
var io = require('socket.io').listen(80);
io.sockets.on('connection', function (socket) {
socket.emit("getSomeData",{data: "some random data"});
});
和客戶...
<script src="http://localhost/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('http://localhost');
socket.on("getSomeData", function(data) {
console.log(data);
});
</script>
編輯:
var io = require('socket.io').listen(80);
io.sockets.on('connection', function (socket) {
socket.on("getSomeData", function(name,fn) {
fn({data: "some random data"});
});
});
客戶
<script src="http://localhost/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('http://localhost');
socket.emit("getSomeData", function(data) {
console.log(data);
});
</script>
在 Liam William 的回答中,我發現有必要將回調(或確認函數)作為客戶端發出的第三個參數發送:
客戶:
<script src="http://localhost/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('http://localhost');
socket.emit("getSomeData", null, function(data) {
console.log(data);
});
你可以有回調,但你必須做的有點不同:
服務器:(app.js)
var io = require('socket.io')(80);
io.on('connection', function (socket) {
// please note that server will take 2 data entries as function parameter below
socket.on('ferret', function (name, fn) {
fn('woot');
});
});
客戶端 (index.html)
var socket = io(); // TIP: io() with no args does auto-discovery
socket.on('connect', function () {
socket.emit('ferret', 'tobi', function (data) {
console.log(data); // data will be 'woot'
});
});
實際上,socket io 也提到了這個; 發送和獲取數據(確認)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.