2017-03-09 113 views
0

我有一个服务,从API获取数据。当我试图调用此服务。它以相同的价值返回。defer.promise在angularJS返回相同的结果

appName.service('FetchCustomerDate', ['$http', '$q', function($http, $q) { 
    var self = this; 
    self.getCustomerData = function(token,name) { 
     var deferred = $q.defer(); 
     return $http({ 
      method: 'GET', 
      url: , 
      headers: { 
       "Authorization": token, 
       "x-xcmc-auth": '' 
      } 
     }).then(function(response) { 
      deferred.resolve(response); 
      return deferred.promise; 
     }, function(response) { 
      deferred.reject(response); 
      return deferred.promise; 
     }); 
    }; 
}]); 
+3

什么是“同值”呢?现在,'return deferred.promise'行什么也不做;只需返回'$ http'承诺。不需要延期。 –

+0

你有没有试过在'.then()'的成功和失败函数之外放置'return deferred.promise'? –

+0

@MikeMcCaughan相同的值表示API响应与先前的API调用相同。 – Player

回答

0

我在这里看到一些混淆。我们试着清除它。如果您想使用延迟的对象,你需要改变你的代码位:

appName.service('FetchCustomerDate', ['$http', '$q', function ($http, $q) { 
    var self = this; 
    self.getCustomerData = function (token, name) { 
     var deferred = $q.defer(); 
     $http({ // Do not return here, you need to return the deferred.promise 
      method: 'GET', 
      url: '...some URL here...', 
      headers: { 
       "Authorization": token, 
       "x-xcmc-auth": '' 
      } 
     }).then(function (response) { 
      deferred.resolve(response); // It's correct, you are resolving the deferred promise here. 
      // return deferred.promise; // You do not need to return the deferred.promise here. 
     }, function (response) { 
      deferred.reject(response); // It's correct, you are rejecting the deferred promise here. 
      // return deferred.promise; // You do not need to return the deferred.promise here. 
     }); 

     return deferred.promise; // The function must return the deferred.promise 
    }; 
}]); 

在细节,功能getCustomerData必须返回属于deferred对象与return deferred.promise的承诺。 then()里面的回调你简单的解决或拒绝deferred的承诺。您不需要返回deferred.promise

您可以改进代码。 $http服务返回一个承诺,并且由then回调返回的值在承诺中包含then方法。知道了,你可以删除deferred对象的使用:

appName.service('FetchCustomerDate', ['$http', function ($http) { 
    var self = this; 
    self.getCustomerData = function (token, name) { 
     return $http({ // Here, you need to return the promise returned by $http. Than promise will contain the response returned inside "then" callbacks. 
      method: 'GET', 
      url: '...some URL here...', 
      headers: { 
       "Authorization": token, 
       "x-xcmc-auth": '' 
      } 
     }).then(function (response) { 
      return response; // Simply return the response, it will be wrapped in a resolved promise by "then()" 
     }, function (response) { 
      return response; // Simply return the response, it will be wrapped in a rejected promise by "then()" 
     }); 
    }; 
}]); 

正如你可以看到,2个then回调只是返回response对象,因为这个原因,你可以忽略它们:

appName.service('FetchCustomerDate', ['$http', function ($http) { 
    var self = this; 
    self.getCustomerData = function (token, name) { 
     return $http({ // Here, you need to return the promise returned by $http. Than promise will contain the response form the GET call 
      method: 'GET', 
      url: '...some URL here...', 
      headers: { 
       "Authorization": token, 
       "x-xcmc-auth": '' 
      } 
     }); 
    }; 
}]); 
+0

非常感谢你 – Player

0

一般当您使用$http服务获取数据时,您希望从响应中获取数据并将其影响到$scope,或者以某种方式对其进行处理。你想做什么?请澄清你的问题。

正常情况下,取到的是这个样子:

appName.service('FetchCustomerDate', ['$http', '$q', function($http, $q) { 
    var self = this; 

    function notifyError(reason) { 
     console.error(reason); 
    } 

    self.getCustomerData = function(token,name) { 
     var deferred = $q.defer(); 
     return $http({ 
      method: 'GET', 
      url: , 
      headers: { 
       "Authorization": token, 
       "x-xcmc-auth": '' 
      } 
     }) 
      .then(function onSuccess(response) { 
      var cfg = response.data; // process data 
     }) 
      .then(function onSuccess(response) { 
      // chained promises 
     }) 
      .then(
      function onSuccess(res) { 
       // ... this will trigger the chain reaction 
       deferred.resolve(res); 
      }, 
      function onFailure(reason) { 
       notifyError(reason); // manage the error 
       deferred.reject(reason); 
      }) 
      ; 
      return deferred.promise; 
     } 
    }]); 
相关问题