Angular工厂没有向控制器返回值

时间:2015-12-30 04:08:26

标签: angularjs

我有一个控制器,它调用服务来执行对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;
});

1 个答案:

答案 0 :(得分:1)

您的服务方法socket.switchSpace()不会返回承诺(或者,因为您已在控制器中实现了具有$ promise属性的对象)。

因此,为了实现这一目标,您需要:

  • 在您的套接字工厂中注入$ q服务
  • 使用$ q.defer()
  • 创建延期承诺
  • 解决回调中的承诺
  • 回复承诺
  • 在你的控制器中调用.then(函数onSuccess(){...}),而不是。$ promise.then()

总而言之,您的服务应如下所示:

.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);
    });
});