Angular JS服务$ http和$ q

时间:2014-04-19 06:20:32

标签: javascript angularjs

我正在从Pluralsight Angular JS教程学习Angular JS $ http和$ q服务。我主要创建了eventData服务,它使用promise q从服务器检索JSON。但是当我将承诺分配给$ scope.event时,它只是空对象。为什么这种方法不起作用?

然后我用谷歌搜索为什么它不起作用。并得到一个不同的代码,它调用promise上的then()函数并将结果赋给$ scope.event

promise队列用于避免传递回调。但是在这里我们将回调函数传递给then函数。并不是说首先有一个承诺队列?

// Event Data Function
eventsApp.factory("eventData", function($http, $q){
    return {
        events : function() {
            var deferred = $q.defer();
            $http({
                method: "GET", url:"http://localhost/data/events/events.php"
            })
                .success(function(data,status,headers,config){
                    deferred.resolve(data);
                })
                .error(function(data,status,headers,config){
                    deferred.reject(status);
                });
            return deferred.promise;
        }
    }
});

// Event controller
var eventController = eventsApp.controller('eventController',function($scope,eventData)    
{
    $scope.event = eventData.events()
});



// Event Controller from googled code
var eventController = eventsApp.controller('eventController',function($scope,eventData)    
{
    eventData.events().then(function(result){
        $scope.event = result
    });
});

2 个答案:

答案 0 :(得分:0)

不,承诺的重点是当你需要在触发另一个依赖于先前返回数据的异步函数之前使异步函数返回时,没有丑陋的回调 - 地狱。

当promise被解析时,调用传递给.then()的函数并将先前返回的数据作为参数传递。

另外,对于它的价值,没有必要在承诺中包含$ http,因为它会按设计返回承诺。

答案 1 :(得分:0)

承诺队列是避免回调汤,但也许你需要一个更深入的例子。

传统上在回调地狱......

var callback3 = function(param) {
  console.log(param);
}

var callback2 = function(param, callback) {
  setTimeout(function() {
     param = param + "end";
     callback(param);
   }, 100);
}

var callback1 = function(param, callback) {
  setTimeout(function() {
     param = param + "the ";
     callback(param, callback3)
   }, 100);
}

var someFunction = function(param) {
   setTimeout(function() {
     param = param + "am ";
     callback1(param, callback2);
   }, 100)
}

someFunction("I ");

但如果我们可以使用承诺......我们的汤就会澄清。

   var somePromise = $q.defer();

   var callback3 = function(param) {
      console.log(param + "end");
    }

    var callback2 = function(param) {
      setTimeout(function() {
         return param + "the ";
       }, 100);
    }

    var callback1 = function(param) {
      setTimeout(function() {
        return param + "am ";
      }, 100);
    }

    var someFunction = function(letter) {
      //could for example be after an http req or some async call.  
      setTimeout(function() {
        somePromise.resolve(letter);
      }, 100);
    }

    someFunction("I ");

    somePromise.promise
      .then(callback1)
      .then(callback2)
      .then(callback3);

我知道我更喜欢调试...