函数在控制器中使用$ q.defer返回不同的响应并解析

时间:2016-01-07 14:10:37

标签: angularjs json angular-ui-router angular-controller

我使用状态提供程序创建了一个状态,我使用了resolve,我使用工厂调用了api。

.state('Test', {
    url: '/Test/:testId',       
    templateUrl: TEMPLATE_URL + 'Test/test.html',
    controller: "testController",
    resolve: { 
         getTest : function($stateParams,TestFactory){
                 return testFactory.getTest($stateParams.testId);
         },   
          testId: ['$stateParams', function ($stateParams) {
          return $stateParams.testId;
        }]
    }
  });
})

我创建了一个具有返回对象

的函数(getTest)的工厂
getTest : function(parmTestId){
             var deferred = $q.defer();
             $http.get(API_URL + "Test/testById?testId="+parmTestId).success(deferred.resolve)
              .error(deferred.resolve);
              return deferred.promise;           
         }

我创建了控制器,注入提供程序

.controller("testController", function($scope,$rootScope,$http,getTest,testId, TestFactory ){
     console.log(getTest); // its work perfectly and return json object  
     var returnObj = TestFactory.getTest(testId); //I called factory function 
     console.log(returnObj)//its not return object its return Promiss
}

当我通过state resolve调用时,我无法理解它,它返回从api调用返回的json对象,但是当我在控制器中调用它不是retrun json对象时。 它的回归

Promise {$$state: Object}
$$state: Object
status: 1
value: Object
__proto__: Object
__proto__: Promise

在值中有我想要的实际结果(json对象) 问题是两种情况,为什么它返回不同的对象?

提前谢谢你。如果你不明白这一点,我会在评论中讨论。

2 个答案:

答案 0 :(得分:1)

它正在返回一个等待处理的promise对象!

您可以.then(successCallback, errorCallback)使用相同的内容:

var returnObj = TestFactory.getTest(testId).then(
  function(res) {
    // The 1st argument passed in this function is the response object
    console.log(res);
  },
  function(err) {
    // This is called in case the request fails
    console.log('Some error: ', err);
  }
);

另外,在getTest方法中找到了错误:

$http.get(API_URL + "Test/testById?
    testId="+parmTestId).success(function(res) { deferred.resolve(res); })
                  .error(function(err) { deferred.reject(err); });
                  return deferred.promise;  

deferred.resolve和deferred.reject是方法,所以你必须调用它们!

答案 1 :(得分:0)

当你使用时

.then(function(res){
    ..
    },function(err){
    ....
});

它的返回res对象有状态,数据等....所以你可以从res.data

获取它

使用时

.success(function(res){
     .......
   });

它的实际数据数据。