2013-10-26 18 views
7

Ich habe eine Schaltfläche, die eine Kommunikation mit dem Server durchführt, um zu überprüfen, ob ein eingegebener Wert (über ein Eingabefeld) bereits existiert. Der Code ist der folgende:socket.io - socket.on warte auf Versprechen

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

Das Problem ist, dass der checkReturn Aufruf asynchron ist, und daher der Code trägt, ohne auf das Ergebnis tatsächlich zu warten. Wie stelle ich sicher, dass checkReturn zuerst fertig ist und nur dann der Rest des Codes ausgeführt wird?

Antwort

8

Neben der anderen Antwort können Sie auch Bestätigungen verwenden, bei denen ein Rückruf zwischen dem Client und dem Server übergeben wird. Dann können Sie einfach den Rückruf der emit-Funktion:

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

Auf der Seite Server es würde wie folgt aussehen:

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

diese Lösung funktioniert viel besser für mich. kannst du mir in ein paar Zeilen erklären, wie funktioniert das fn() Callback genau? Ich kann mich nicht darum kümmern. – Tamas

+0

Die 'fn()' ist eine Callback-Funktion. In JavaScript können Sie eine Funktion an eine andere übergeben und sie später aufrufen. In diesem Fall hat Socket.IO "Bestätigungen" implementiert, bei denen Sie eine Funktion an den Server übergeben und der Server diese Funktion aufruft. – hexacyanide

+0

Danke, ich weiß es zu schätzen. – 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

so sollte ich einfach wickeln alles innerhalb des socket.on Anruf? – Tamas

+0

Ja, das ist der Weg –