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