2014-08-31 131 views
1

我需要幫助,使我的JavaScript異步,因爲我從節點的數據庫查詢。我使用node.js和socket.io。如果我使用setTimeout()函數,代碼將起作用,但我想讓代碼更可靠,所以我試圖實現回調。但是,我不知道如何在回調函數中正確使用「socket.on()」。我認爲問題是我嵌套socket.on調用和第二個「socket.on()」調用不執行。任何幫助將不勝感激,謝謝。異步socket.io javascript回調不起作用

/*server side*/ 
socket.emit(variable1);//not important 
socket.emit(variable2);//not important 
//code above isn't important, I just wanted to show how data is used from my queries 



/*client side*/ 
var socket = io.connect('123.456.789.123:3000'); 
var data = " ";//data I need to pass around 


    socket1(data, function(){ 
     socket2(data) 
    }); 


    function socket1(data, callback) { 
     socket.on('variable1', function (data) { 
      console.log("1"); 
      callback(); 
     }, callback) 
    } 

    function socket2(data) { 
     console.log("2"); 
     socket.on('variable2', function (data) { 
      console.log("3"); 
     }) 
    } 

的輸出爲「12」 和應爲「123」

回答

2

想起函數異步的調用作爲對註冊處理時數據被接收作爲來自服務器的推動的登記處理。

function registerVariable1(callback) { 

    socket.on('variable1', function (data) { 
     console.log("1"); 
     callback(data); 
    }); 
} 

function registerVariable2(callback) { 

    socket.on('variable2', function (data) { 
     console.log("2"); 
     callback(data); 
    }); 
} 

在服務器上,當你發出數據到客戶端,將處理程序作爲第一個參數的名稱,描述here

socket.emit('variable1', {data: 1}); 
socket.emit('variable2', {data: 2}); 

這會將數據發送到正確的處理程序。

說了這話,你可能會想到這個錯誤。不要將每個處理程序視爲特定於單個操作。可以將此視爲向服務器註冊偵聽器,以便服務器可以繼續將數據發送回該處理程序。只需要調用registerVariable1和registerVariable2一次,然後你的服務器就可以將數據返回給每個處理器N次。

要註冊的處理程序,您只需傳遞一個回調函數到每個:

registerVariable1(function(data) { 
    console.log('This is the first handler'); 
    console.log(data); 
    // do stuff for this handler here... 
}); 

registerVariable2(function(data) { 
    console.log('This is the second handler'); 
    console.log(data); 
    // do stuff for this handler here... 
}); 

現在,如果服務器提出了以下三個調用:

socket.emit('variable1', {data: 123}); 
socket.emit('variable2', {data: 24}); 
socket.emit('variable1', {data: 22}); 

您可能會看到下面的輸出:

1 
This is the first handler 
{data: 123} 
2 
This is the second handler 
{data: 24} 
1 
This is the first handler 
{data: 22} 

可能無法保證排列順序。然而,因爲你正在處理網絡。但希望這可以幫助你看到這是如何工作的。

+0

嘿,感謝您的深入解釋!我的服務器代碼只能發出一次,因爲它在從數據庫中進行查詢之後就這樣做了。我按照指定的方式實現了我的代碼,並且輸出正在打印,但方法以錯誤的順序打印出來(2,1)。有沒有辦法確保registerVariable1()在調用registerVariable2()之前執行並完全結束?這就是我想要實現的,也許服務器端是問題,但我不能多次查詢,因此每個處理程序只能有一組數據發射。希望這是有道理的。再次感謝! – 2014-08-31 01:47:07

+0

這聽起來像你的問題不是服務器端,它是客戶端。這聽起來像是當你發佈數據庫時你有所有數據,所以你可以在JSON對象中發射它,然後分別處理這些數據,不是嗎? – jmort253 2014-08-31 01:48:41

+0

換句話說,'socket.emit({varOne:dataForVar1Here,varTwo:dataForVar2Here});'一次發送所有數據,就是我所說的...... – jmort253 2014-08-31 01:49:26