【问题标题】:Function return different response using $q.defer in controller and resolve函数在控制器中使用 $q.defer 返回不同的响应并解析
【发布时间】:2016-01-07 14:10:36
【问题描述】:

我使用状态提供程序创建了一个状态,我使用了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
}

当我通过状态解析调用时,我无法理解它返回的 json 对象是从 api 调用返回的,但是当我在控制器中调用它时,它不会返回 json 对象。 它的回报

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    您也可以使用.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 是方法,所以你必须调用它们!

    【讨论】:

    • 谢谢它的工作正常。但我不明白为什么在不处理它的情况下解析它的返回实际对象?
    • 您的 Testfactory 的 getTest 方法可能会返回如下内容:return $http.get(url)。你还没有发布它的代码,但我很确定!
    • 在我的 api 调用中没有任何问题可以正常工作。并运行代码没有错误。但问题仍然在我的脑海中
    • 问题不在于您的 api。即使您以正确的方式提出请求,但您没有正确处理它。 $http.get , $http.post 等以角度返回 Promise,必须解析才能访问响应。
    • 好的,我会根据你的回复去做。但在状态解析中,我没有处理承诺响应,但它返回 json 对象而不写 .then(funcion(res){})
    【解决方案2】:

    当你使用时

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

    它的返回 res 对象包含状态、数据、....等,因此您可以从 res.data 中获取它

    当你使用时

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

    它返回实际数据数据。

    【讨论】:

      猜你喜欢
      • 2022-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-30
      • 1970-01-01
      • 1970-01-01
      • 2016-01-30
      • 1970-01-01
      相关资源
      最近更新 更多