角度承诺和$ http

时间:2016-06-03 08:06:28

标签: javascript angularjs http promise

ng.module('app')
    .service('CardService', ['$http', CardService])

function CardService($http) {
    this.$http = $http;
    var self = this;

  $http.get('http://localhost:3000/db').success(function(data) {
      self.items = data;
      console.log(self.items);
  });
  console.log(self.items);
}

CardService.prototype.list = function() {
        console.log(self.items);
        return this.items;
};

和结果

  

service.js:14 undefined

     

service.js:18 undefined

     

service.js:18 undefined

     

service.js:12 [Object,Object,Object]

如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

ajax调用是异步的。它将允许线程在等待来自.get

的响应时继续运行

然后将按此顺序调用您正在执行的console.log。

  1. console.log正好在你的ajax电话下面
  2. 列表原型中的
  3. console.log
  4. (在ajax成功之内)

      列表原型中的
    1. console.log
    2. console.log低于self.items = data
    3. 不是有角度的方式,但......只有在ajax调用中初始化列表时才应使用原型。

答案 1 :(得分:0)

根据最佳实践,您应该使用所有与http请求相关的内容来使用工厂或服务获取数据。因为它是异步流,所以$ q将用于处理它。所以你的功能将如下所示完成。如果我误解了你的问题,请纠正我。

app.factory('CardService',function($http,$q) {
var obj = {};

    obj.getCardServiceData = function(){
        var defer = $q.defer();
        $http.get('http://localhost:3000/db').then(function(response) {
         defer.resolve(response.data);
       },function(error){
          defer.reject(error);
       });
       return defer.promise;
    }

    return obj;

});

app.controller('YOUR CONTROLLER',function($scope,CardService){
      CardService.getCardServiceData().then(function(response){
           $scope.self = response.data;
           console.log($scope.self);
       },function(error){
           alert("There seems to be some error!");
           console.error(error);

       });
});