我使用承诺来定义工厂,如:
.factory('Test', ['$q', '$http', function ($q, $http){
var getData = function () {
var deferred = $q.defer();
$http.get('url')
.success(function (res) {
deferred.resolve(res);
});
return deferred.promise;
}
return { getData: getData};
}]);
此外,在控制器中,我使用该工厂,如:
Test.getData().then(function (data) { console.log(data);});
一切正常,我的问题是:如果我想在另一个控制器中使用相同的承诺在我做其他事情之前等待那个ajax,我应该使用相同的sintax?
Test.getData().then(function (data) { console.log(data);});
我的问题是我使用节点js套接字来检索一些数据和事件。在我的承诺中我连接插座
$rootScope.socket = io_connection
并且在另一个控制器中,在另一个页面上我想在该套接字上发出一个事件,但$ rootScope.socket未定义。由于$ rootScope.socket在第一个承诺中定义,在我的另一个控制器中我试过:
$rootScope.socket.emit('custom_event', { id: 1 });
但未定义...... 我希望我的写作有道理。 感谢
答案 0 :(得分:1)
由于您的getData
始终返回一个承诺,而不是保存实际数据,您可以改为保留承诺对象:
.factory('LoggedUserData', ['$q', '$http', function ($q, $http) {
var waitingPromise = null;
var getData = function () {
if(!waitingPromise){
waitingPromise = $http.get('url');
}
return waitingPromise;;
}
return { getData: getData };
}])
现在,无论哪个控制器对象首先被初始化,两者都会收到相同的数据。
答案 1 :(得分:0)
您需要首先定义女巫控制器。
我不知道如果控制器不具有范围继承权,那么让控制器相互依赖是否是一个好主意。
也许您可以在服务中创建此套接字并在两个控制器上使用。