2015-10-05 226 views
3

看看我的代碼示例:

我已經剝離下來到(我認爲是)最基本的要素,和我設置得到一個錯誤deferred.reject is not a function

angular 
    .module('myApp') 
    .service('myService', MyService); 

MyService.$inject = ['$http', '$q']; 

function MyService($http, $q) { 
    var self = this; 

    self.getResult = getResult; 

    function getResult(id) { 
     var deferred = $q.defer(); 

     deferred = $http.get('my/api/method', { params: { id: id } }) 
      .then(getResultCompleted) 
      .catch(getResultFailed); 

     function getResultCompleted(response) { 
      if (response.data.ID > 0) { 
       deferred.resolve(response.data); 
      } else { 
       deferred.reject(response); 
      } 
     } 

     function getResultFailed(response) { 
      deferred.reject(response); 
     } 

     return deferred.promise; 
    } 
} 

:我知道我能得到這個由然而簡單地返回$ HTTP調用的結果,爲了瞭解這些承諾對象而言的工作,我想看看我是否能得到這工作通過宣佈並返回deferred如上所示

謝謝!

+0

'$ http.get()'返回承諾,但不延遲 – Vadim

+0

@Vadim:我不明白。你可以請Elbourate? – Ricky

+0

我指的是'deferred = $ http.get()'字符串。這是不正確的,因爲'$ http.get()'不會返回延遲對象,但它是承諾的。所以,你可以返回'$ http.get' – Vadim

回答

3

你正在創建自定義的承諾,從你的方法還,但意味着在處理它要覆蓋deferred(自定義承諾對象)與$http.get,這也返回一個具有.then & .catch方法(它沒有承諾resolve & reject方法)。由於該分配,您無法訪問來自deferred對象的.resolve.reject

deferred = $http.get('my/api/method', { params: { id: id } }) 

應該只有

$http.get('my/api/method', { params: { id: id } }) 
+0

謝謝@PankajParkar。這裏我還有點不清楚。如果它被賦值爲$ http.get的返回結果的值,那麼這基本上不會意味着它的值嗎? – Ricky

+0

@Ricky不..沒有什麼承諾的工作..承諾意味着你說,我有東西要返回&我會在一段時間後..這就是爲什麼你創建'var deferred = $ q.defer(); '當你收到一個響應時,你可以用數據'reject'來解析數據,使用相同的數據。如果你做'deferred = $ http.get('my/api/method',{params:{id:它將清除整個對象傳統'$ http.get'承諾對象將在其中引入.. –

1

由於$http.get()回報承諾和成功回調支持鏈式API,你可以定義一個回調的內新遞延對象,並從那裏返回它:

angular 
    .module('myApp') 
    .service('myService', MyService); 

MyService.$inject = ['$http', '$q']; 

function MyService($http, $q) { 
    var self = this; 

    self.getResult = getResult; 

    function getResultCompleted(response) { // Tip: Define callback outside of getResult in order to avoid creating new instance of it each time getResult is called 
     var deferred = $q.defer(); 
     if (response.data.ID > 0) { 
      deferred.resolve(response.data); 
     } else { 
      deferred.reject(response); 
     } 
     return deferred.promise; 
    } 

    function getResult(id) { 
     return $http.get('my/api/method', { params: { id: id } }) 
      .then(getResultCompleted); 
    } 
} 

請注意,不再有錯誤回調(僅僅因爲在這種情況下它是冗餘的)。

如果請求失敗,原始拒絕的承諾將從$http.get()將被退回,否則一個全新的成功回調承諾將用於後續.then()調用。

+0

謝謝@Vadim。 「延期」賭注在哪裏申報?我在代碼中看不到它(雖然也許我錯過了它) – Ricky

+0

@Vadim我不明白你爲什麼在返回'$ http.get'時承諾使用延遲對象 –

+0

@PankajParkar一旦承諾解決了,你不能再拒絕它了。由於'$ http'原來的承諾已經解決,你需要在一定條件下拒絕它,你需要創建新的承諾,爲此你需要新的延期。 – Vadim