2013-10-26 283 views
7

我有一个按钮,它与服务器进行一些通信以检查输入值(通过输入框)是否已经存在。该代码是下面的:socket.io - socket.on等待承诺

$("#button").click(function() { 
    var exists = false; 
    var name = $("#name").val(); 
    socket.emit("check", name); 

    socket.on("checkReturn", function (data) { 
     exists = data.result; 
    }); 

    if (exists) { 
     console.log("exists") 
    } else { 
     if (name.length > 0) { 
      socket.emit("create", name); 
     } 
    } 
}); 
}); 

的问题是,checkReturn呼叫是异步的,因此,代码进行而不实际等待结果。我如何确保checkReturn第一次完成,然后才能执行其余的代码?

回答

8

除了另一个答案,您还可以使用确认,在客户端和服务器之间传递回调。然后,你可以使用的表达函数的回调:

$("#button").click(function() { 
    var exists = false; 
    var name = $("#name").val(); 

    socket.emit('check', name, function (data) { 
    exists = data.result; 
    if (exists) console.log("exists"); 
    else (if (name.length > 0) socket.emit("create", name)); 
    }); 
}); 

在服务器端,它应该是这样的:

io.sockets.on('connection', function (socket) { 
    socket.on('ferret', function(name, fn) { 
    // find if "name" exists 
    fn({ exists: false }); 
    }); 
}); 
+0

这个解决方案对我来说更好。你能在几行中向我解释那个fn()回调函数是如何工作的?我无法理解它。 – Tamas

+0

'fn()'是一个回调函数。在JavaScript中,您可以将一个函数传递给另一个函数,然后再调用它。在这种情况下,Socket.IO实现了“确认”,您将功能传递给服务器,服务器调用该函数。 – hexacyanide

+0

谢谢,我很感激。 – Tamas

1
$("#button").click(function() 
{ var exists = false; 
var name = $("#name").val(); 
socket.emit("check", name); 

socket.on("checkReturn", function (data) { 
exists = data.result; 
if (exists) { console.log("exists") } else { if (name.length > 0) { socket.emit("create", name); } } });  
}); 
+0

所以我应该只是包装的socket.on调用内部的一切吗? – Tamas

+0

是的,这就是 –