我有一个控制器,它调用服务来执行对socket.io服务器的调用。该服务工作(发送命令到socket.io)但不触发控制器上的回调(承诺)。我错过了什么?
.controller('SettingsCtrl1', function($scope,socket) {
socket.switchSpace(spaces).$promise.then(function(data) {
alert("CALLBACK: " + data); //does not fire
});
});
并在我的服务中:
.factory('socket', function (socketFactory) {
var connection = io.connect('http://example.com:3000');
var socket = socketFactory({
ioSocket: connection
});
socket.switchSpace = function(spaces) {
socket.emit('leaveSpace', spaces.oldspace, function(callback) {
if(callback == 'success') { //we make it here
socket.emit('joinSpace', spaces.newspace, function(callback) {
if(callback == 'success') {
//we make it here
return callback; //does not make it back to controller
}
})
}
})
}
return socket;
});
答案 0 :(得分:1)
您的服务方法socket.switchSpace()不会返回承诺(或者,因为您已在控制器中实现了具有$ promise属性的对象)。
因此,为了实现这一目标,您需要:
总而言之,您的服务应如下所示:
.factory('socket', function (socketFactory, $q) {
var connection = io.connect('http://example.com:3000');
var socket = socketFactory({
ioSocket: connection
});
socket.switchSpace = function(spaces) {
var deferred = $q.defer();
socket.emit('leaveSpace', spaces.oldspace, function(callback) {
if(callback == 'success') {
socket.emit('joinSpace', spaces.newspace, function(callback) {
if(callback == 'success') {
deferred.resolve(callback);
}
})
}
});
return deferred.promise;
}
return socket;
});
你的控制器应该是这样的:
.controller('SettingsCtrl1', function($scope,socket) {
socket.switchSpace(spaces).then(function(data) {
alert("CALLBACK: " + data);
});
});