2013-10-26 16 views
7

Ho un pulsante che esegue alcune comunicazioni con il server per verificare se esiste già un valore inserito (tramite una casella di input). Il codice è il seguente:socket.io - socket.on attendere la promessa

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

Il problema è che la chiamata checkReturn è asincrona, e quindi il codice svolga senza realmente aspettando il risultato. Come faccio a essere sicuro che checkReturn sia finito e solo allora il resto del codice viene eseguito?

risposta

8

A parte l'altra risposta, è anche possibile utilizzare riconoscimenti, dove viene passato un callback tra il client e il server. Poi si può semplicemente utilizzare il callback della funzione 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)); 
    }); 
}); 

Sul lato server sarebbe simile a questa:

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

funziona molto meglio per me. puoi spiegarmi in poche righe come funziona esattamente questa callback fn()? Non riesco a capirlo. – Tamas

+0

Il 'fn()' è una funzione di callback. In JavaScript, puoi passare una funzione a un'altra e poi chiamarla in un secondo momento. In questo caso, Socket.IO ha implementato "riconoscimenti", in cui si passa una funzione al server e il server chiama tale funzione. – hexacyanide

+0

Grazie, lo apprezzo. – 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

quindi dovrei avvolgere tutto dentro la chiamata socket.on? – Tamas

+0

sì, è così che la soluzione –