簡體   English   中英

異步socket.io javascript回調無法正常工作

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

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