少し前にオンラインゲームで使った素敵な方法がありますが、サーバー側のものも変更する必要があります!
最初にデータを送信する関数を作成します
var socketQueueId = 0;
var socketQueue = {};
function sendData(data, onReturnFunction){
socketQueueId++;
if (typeof(returnFunc) == 'function'){
// the 'i_' prefix is a good way to force string indices, believe me you'll want that in case your server side doesn't care and mixes both like PHP might do
socketQueue['i_'+socketQueueId] = onReturnFunction;
}
jsonData = JSON.stringify({'cmd_id':socketQueueId, 'json_data':data});
try{
webSocket.send(jsonData);
console.log('Sent');
}catch(e){
console.log('Sending failed ... .disconnected failed');
}
}
次に、サーバー側で要求を処理するときに、応答とともに cmd_id をクライアントに送り返す必要があります。
webSocket.onmessage = function(e) {
try{
data = JSON.parse(e.data);
}catch(er){
console.log('socket parse error: '+e.data);
}
if (typeof(data['cmd_id']) != 'undefined' && typeof(socketQueue['i_'+data['cmd_id']]) == 'function'){
execFunc = socketQueue['i_'+data['cmd_id']];
execFunc(data['result']);
delete socketQueue['i_'+data['cmd_id']]; // to free up memory.. and it is IMPORTANT thanks Le Droid for the reminder
return;
}else{
socketRecieveData(e.data);
}
}
他のすべてのタイプの返品を処理する関数を作成します。
socketRecieveData(data){
//whatever processing you might need
}
したがって、サーバーにデータを送信し、その特定のデータの応答を待ちたい場合は、次のようにします。
sendData('man whats 1+1', function(data){console.log('server response:');console.log(data);});