[英]Asynchronous socket.io javascript callback not working
我需要幫助使我的javascript異步,因為我從具有節點的數據庫查詢。 我正在使用node.js和socket.io。 如果我使用setTimeout()函數,代碼可以工作,但我想讓我的代碼更可靠,所以我試圖實現回調。 但是,我不知道如何在回調函數中正確使用“socket.on()”。 我認為問題是我嵌套socket.on調用,第二個“socket.on()”調用不執行。 非常感謝任何幫助,謝謝。
/*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”
將異步函數調用視為注冊處理程序的注冊過程,以便在從服務器推送數據時接收數據。
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);
});
}
在服務器上,當你發出數據到客戶端,將處理程序作為第一個參數的名稱,描述在這里 。
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}
訂單可能無法保證; 但是,因為你正在處理網絡。 但希望這有助於您了解其工作原理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.