サーバとクライアントが接続するまで処理を待機
Node.jsのSocket.ioを使ってサーバとクライアントを繋げたんですが、接続が完了するまでに微妙に時間がかかってしまい、接続する前にエミットしたデータが取得できないという状況に陥ったので、繋がるまで待機させた時のメモ。
サーバー側
expressを使ったのでbin/www上で接続する。サーバ側はこんな感じ。
./bin/www
#!/usr/bin/env node
var debug = require('debug')('WillDo')
, app = require('../app')
, http = require('http');
exports.connected = false;
app.set('port', process.env.PORT || 3000);
var server = app.listen( app.get('port'), function() {
debug('Express server listening on port ' + server.address().port );
});
// Websocket
var io = require('socket.io').listen(server);
io.sockets.on('connection', function(socket) {
console.log('サーバとクライアントつながりましたb');
exports.connected = true; // 接続したらtrueに
socket.on('disconnect', function() {
console.log('途切れました');
});
});
exports.connected = false;
と接続完了したかを示す変数connectedを外部から取得できるようにモジュール化。connectionで接続完了したらしっかりとtrueにしておく。
var www = require('./bin/www');
var async = require('async');
// socketがつながるまでループする。
async.until(function(){ return www.connected; }, function(callback) {
// 500ms待ってまだ繋がってなかったらもう一度500ms待つ。。。の繰り返し
setTimeout(callback, 500);
console.log('まだ繋がってないよ');
}, function(err) {
console.log('つながったよ');
});
async#untilの仕様
これで外部のファイルからでも、繋がってるかを確認してから処理を行えるようになった。サーバー側、クライアント側だけなら
server.js
var io = require('socket.io').listen(server);
io.sockets.on('connection', function(socket) {
console.log('繋がったよ');
});
client.js
$(function(){
var socket = io.connect();
socket.on('connect', function() {
console.log('繋がったよ');
});
});
この中に処理をかけば、いい感じなんだろうけど、これ以外の外部ファイルで接続を確認してから処理を行いたかったので、以上の感じにしてみました。メモメモφ(・・