2015-12-30 65 views
0

我有一個控制器,調用服務來執行到socket.io服務器的調用。該服務工作(向socket.io發送命令),但控制器上的回調(promise)未被觸發。我錯過了什麼?角度工廠沒有返回值給控制器

.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

你的控制器沒有調用返回'callback'功能。 ..所以它返回到'socket.emit'閉包,而不是你的控制器。 –

+0

@ShaunScovil即使硬編碼'返回成功'到socket.switchSpace函數的末尾,我也無法獲得任何東西回到控制器。 – lilbiscuit

回答

1

你的服務方法socket.switchSpace()不以$承諾返回一個承諾(或如你已經在你的控制器實現了它,對象屬性)。

因此,爲了使這項工作,你需要:

  • 在套接字工廠注入$ Q服務
  • 使用$ q.defer()創建延期承諾
  • 解決在你的控制器,而不是在你的回調
  • 回報的承諾
  • 電話。於是答應(函數的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); 
    }); 
}); 
+0

謝謝@ShaunScovil ...這完美運行。顯然我需要研究$ q和承諾。 – lilbiscuit