サービスの定義
socket.js
app.factory('Socket', function($rootScope, $q) {
const makeAsyncCb = (cb)=> (data)=> {
const deferred = $q.defer();
cb(data, (data, cb)=> deferred.resolve([data, makeAsyncCb(cb)]));
return deferred.promise;
};
return class Socket {
constructor() {
this.socket = io();
}
on(name, fn) {
this.socket.on(name, fn && ((...args)=> {
$rootScope.$apply(()=> fn(...args));
}));
}
onAsync(name, fn) {
this.socket.on(name, (data, cb)=> {
fn($q.resolve([data, makeAsyncCb(cb)]));
});
}
emit(name, arg, fn) {
this.socket.emit(name, arg, fn && ((...args)=> {
$rootScope.$apply(()=> fn(...args));
}));
}
emitAsync(name, arg) {
const deferred = $q.defer();
this.socket.emit(name, arg, (data, cb)=> {
deferred.resolve([data, makeAsyncCb(cb)]);
});
return deferred.promise;
}
};
});
使う時
my-controller.js
app.controller('myController', function(Socket) {
const socket = new Socket();
socket.onAsync('greeting-from-server', promise => {
promise.then(([data, cbAsync])=> {
console.log(data);
return cbAsync('Nice to meet you, too.');
}).then(([data, cbAsync])=> {
console.log(data);
});
});
socket.emitAsync('greeting-from-client', 'Hello!').then(([data, cbAsync])=> {
console.log(data);
return cbAsync('Have a nice day.');
}).then(([data, cbAsync])=> {
console.log(data);
});
});