AngularJS,Promises和回调

时间:2014-01-19 08:03:59

标签: javascript angularjs

我有以下代码(轮询工厂和控制器):

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。有什么帮助吗?

2 个答案:

答案 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将在回调中更新。