2013-12-19 94 views
0

早安,

我想知道是否有默認情況下附加一個承諾的方式,我會更好地解釋....

module.factory('serviceName', function($http) { 
$http.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded"; 

return { 
     call1: function(callback) { 
      return $http.post('url1/something').then(callback); 
     }, 
     call2: function(param1, param1, callback) { 
      return $http.post('url2/something', $.param({param1: param1, param2: param2, })).then(callback); 
     } 
    }; 
}); 

這基本上是我的服務,我想知道是否有在每一個使用這樣的通話結束鏈接一個承諾的方式$ http.default.something 這將是真正的幫助:d

+0

'$ http.post'已經返回一個承諾。這個承諾已經可以鏈接了。什麼是問題? –

+0

是的,我知道這一點。好的,我需要在第一個鏈接之後鏈接另一個THEN,並且因爲我有點懶,我只想知道是否可以在第一個承諾之後定義一個地方,在我的服務中爲每個呼叫附加另一個(無需手動執行) ) – Aliceiw

+1

是的,你可以做到這一點。你只需要在第一個'then'內部返回另一個承諾。 –

回答

1

如果有一種方法鏈接ap romise

  • 您可以鏈的承諾,創造碼流
  • 一個優勢:錯誤傳播,所以你可以捕捉它的 鏈的末端

參考鏈承諾如何工作

enter image description here

關於你的例子:

我不認爲它的使用callback$http.post回報承諾本身就是一種很好的方式。

如果你想創建工廠的回報承諾,你可以這樣寫:

  var request = function(data) { 
         var deferred = $q.defer(); 
         var configHttp = { 
           method: 'POST', 
           url: 'some URL' 
         }; 
         if (data !== undefined) { 
           configHttp.data = data; 
         } 
         $http(configHttp).success(function(data, status, headers) { 
           if (data.error === undefined) { 
             deferred.resolve(data); 
           } else { 
             deferred.reject(data); 
           } 
         }).error(function(data, status, headers) { 
           deferred.reject(data); 
         }); 
         return deferred.promise; 
       } 
       return { 
        call1: function(param1) { 
          return request('get_1', {param: param1}); 
        }, 
        call2: function(param2) { 
          return request('get_2', {param: param2}); 
        } 

所以控制器,我們可以這樣寫:

serviceName.call1..then(function(result) 
{    
       //.... 

    }, function(error) { 
    alert(error.message); 
    }); 
+0

謝謝你,我解決了你的答案,並把它做成了我的;) – Aliceiw