2013-10-26 20 views
7

Tôi có một nút thực hiện một số giao tiếp với máy chủ để kiểm tra xem giá trị đã nhập (thông qua hộp nhập liệu) đã tồn tại chưa. Mã này là như sau:socket.io - socket.on chờ lời hứa

$("#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); 
     } 
    } 
}); 
}); 

Vấn đề là cuộc gọi checkReturn là không đồng bộ, và do đó các mã mang về mà không thực sự chờ đợi kết quả. Làm thế nào để đảm bảo rằng checkReturn là lần đầu tiên hoàn thành và chỉ sau đó phần còn lại của mã được thực hiện?

Trả lời

8

Ngoài câu trả lời khác, bạn cũng có thể sử dụng xác nhận, trong đó một cuộc gọi lại được chuyển giữa máy khách và máy chủ. Sau đó, bạn chỉ có thể sử dụng callback của hàm Emit:

$("#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)); 
    }); 
}); 

Về phía server nó sẽ trông như thế này:

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

giải pháp này hoạt động tốt hơn cho tôi. bạn có thể giải thích cho tôi một trong một vài dòng như thế nào mà fn() gọi lại hoạt động chính xác? Tôi không thể có được đầu của tôi xung quanh nó. – Tamas

+0

'fn()' là hàm gọi lại. Trong JavaScript, bạn có thể chuyển một hàm này sang hàm khác và sau đó gọi hàm này sau. Trong trường hợp này, Socket.IO đã thực hiện "xác nhận", nơi bạn chuyển một hàm tới máy chủ và máy chủ gọi hàm đó. – hexacyanide

+0

Cảm ơn, tôi đánh giá cao điều đó. – 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

vì vậy tôi chỉ cần quấn tất cả mọi thứ bên trong gọi socket.on? – Tamas

+0

yes đó là cách –

Các vấn đề liên quan