2013-10-26 15 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コール内部のすべてをラップする必要があります次に、あなただけのEMIT関数のコールバックを使用できますか? – Tamas

+0

はい、それは方法です –

関連する問題