簡體   English   中英

如何從socket.io發出獲取回調,然后將其返回給父函數

[英]How to get the callback from a socket.io emit and then return it to the parent function

我有一個名為listClients的js函數。 它發出一個socket.io發出請求,從使用fs讀取文件的node.js服務器中獲取客戶端列表,然后通過回調將數據發送回客戶端。

我需要將回調數據返回到原始函數,以便客戶端可以執行該函數並使用其返回的數據,但是由於回調包裝在其自己的函數中,因此無法正常工作。 解決此問題的最佳方法是什么?

客戶:

function listClients() {
    var sender = getCookieData('relay_client_id');

    if (sender) {
        socket.emit('list_relay_clients', sender, (callback) => {
            return callback; //This won't work because it's async
        });

        return callback; //<---- I need it to be here
    }
}

服務器:

socket.on('list_relay_clients', function (sender, callback) {
    callback(fetchAllClients());
});

這更多是基本的JS和異步執行問題。 您有一個異步調用,想返回一個同步輸出。 這不是正確的事情。 因此,在這種情況下,您應該開始查看承諾

function listClients() {
    return new Promise( resolve => {
    var sender = getCookieData('relay_client_id');

    if (sender) {
        socket.emit('list_relay_clients', sender, (callback) => {
            resolve(callback)
        });
    }
    });
}

然后,該函數的用戶應按以下方式調用此函數

listClients().then(data=>console.log(data))

如果他們對這樣的等待不感興趣,並且具有異步/等待JS功能,則可以使用

async function clientCode() {
   let clientData = await listClients();
}

如果您還想使其同步,請閱讀以下文章

http://www.tivix.com/blog/making-promises-in-a-synchronous-manner

但是,由於JS是異步的(涉及網絡調用的操作),因此您應嘗試使其保持異步,嘗試使其保持同步不是一個好習慣

暫無
暫無

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

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