簡體   English   中英

JavaScript,node.js在繼續之前等待socket.on響應

[英]JavaScript, node.js wait for socket.on response before continuing

我需要從客戶端的服務器獲取信息。 所以在服務器端,我在客戶端第一次連接時得到了這個:

socket.on('adduser', function(username){
    // misc code, where i set num_player and whatnot
    socket.emit('confirmauth', socket.id, socket.num_player, function(data){
         console.log(data)
    });
    // code
}

在客戶端我得到了這個:

var current_player;
socket.on('confirmauth', function(id, username, num, callback) {

    current_player = new Player(username,id, num);

    console.log(current_player.id); // works
    console.log(current_player.num); //works
    callback('ok i got it');
});

console.log(current_player.id); //undefined
console.log(current_player.num); //undefined

我的問題是在套接字之外,播放器沒有定義。 似乎javascript不會等待我的套接字在繼續之前檢索數據。

我嘗試將socket.on包裝在$ .when中,但它不起作用。 我試圖做一個回調,但我想我可能不太了解它應該如何工作。 所以,如果你們中的一個願意幫助我,我將不勝感激

謝謝您的回答。

如果你將current_player變量放在on回調之外試圖return它,另一種方法是讓你自己的函數接收回調

function getPlayer(onDone){
    socket.on('confirmauth', function(id, username, num, callback) {
        var current_player = new Player(username,id, num);
        onDone(current_player);
    });
}

而不是做

var player = getPlayer();
//...

你做

getPlayer(function(player){ 
    //...
});

有點糟糕的是,“回調”在Javascript中有點傳染性,但這種生活直到每個人都開始使用生成器。

這是因為socket.on運行回調,並且在回調中設置了播放器。 但是,在調用socket.on你嘗試讀取播放器,但是沒有設置,因為沒有調用回調。 記住你正在處理異步編程。 嘗試使用nibble在回調后鏈接該代碼。

記住: socket.on和許多其他套接字處理程序 - 甚至許多其他事件句柄(例如jquery) - 不要等到事件發生,所以你必須異步思考。

舉個例子:

  1. 在套接字連接時調用socket.on (連接需要3秒鍾,例如,客戶端在Tor后面)。 socket.on分配事件處理程序(它是唯一的事情,因為它適用於它擁有的11個或更多事件,以同樣的方式)。
  2. 您可以訪問播放器。

但是點1不需要3秒,因為它只是一個任務 - 連接需要3秒才能建立。 從這個意義上說,你有一個未定義的(實際上是:未分配的)變量。

所有這些操作都是異步的,因此最好盡可能避免全局變量和有狀態。

那就是說,讓你的回調將新創建的Player對象帶到它需要去的地方 - 也許是一個玩家注冊? - 並以這種方式運輸。

callback(current_player)

從那里,您可以根據需要將其放入全局可用對象中,例如,如果您正在使用Backbone或在服務器端有一些東西跟蹤當前用戶。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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