簡體   English   中英

socket.io:客戶端發出回調永遠不會觸發

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM