我有以下代码(轮询工厂和控制器):
app.factory('pollingService', ['$http', function($http){
var defaultPollingTime = 3000;
var polls = {};
return {
startPolling: function(name, url, pollingTime, callback) {
// Check to make sure poller doesn't already exist
if (!polls[name]) {
var poller = function() {
$http.get(url).then(callback);
}
poller();
polls[name] = setInterval(poller, pollingTime || defaultPollingTime);
}
},
stopPolling: function(name) {
clearInterval(polls[name]);
delete polls[name];
}
}
}]);
以下控制器:
app.controller("dashboardController", function ($scope, pollingService){
var serverBackendURL = "/json/testclass.php";
$scope.getDashStats = pollingService.startPolling("dash", serverBackendURL, 3000, function(callback){
return callback.data;
});
console.log($scope.getDashStats);
});
当然,$ scope.getDashStats是未定义的,因为 - 如果我错了,请纠正我 - startPolling返回一个promise。我对角度很新,但我已经搜索了很多关于promises的内容,我认为我已经有了这个概念,但我不知道如何重新编写所有内容以使用getDashStats。有什么帮助吗?
答案 0 :(得分:0)
好吧,你不会返回你的轮询器承诺的任何地方。如果未根据ECMA规范指定返回,则JS返回undefined。所以你需要返回你的promise对象($ http.get(..)或者你需要并返回时自己做出承诺)
或者你只需要在回调中分配范围变量,如下所示:pollingService.startPolling(“dash”,serverBackendURL,3000,function(result){$ scope.dashStats = result;});请不要使用与函数名称类似的名称命名结果。它让人困惑。在这种情况下,不要使用getDashStats更好地使用dashStats。根据惯例的getDashStats应该是一个函数(但是它不应该承诺它不应该)
答案 1 :(得分:0)
只需将其更改为:
pollingService.startPolling("dash", serverBackendURL, 3000, function(callback){
$scope.getDashStats = callback.data;
});
但我认为你需要这个:
pollingService.startPolling("dash", serverBackendURL, 3000, function(data){
$scope.getDashStats = data;
});
请注意,调用console.log($scope.getDashStats);
也会显示undefined
,因为响应尚未到达。但只要数据到达,您的$scope.getDashStats
将在回调中更新。