2015-06-08 40 views
0

我有一個Angular Service我想用它來執行兩個$http調用,並返回第二個結果。這裏的服務:

angular.module('myApp', []) 
    .service('farm', ['$http']); 

function farm($http) { 
    this.saveFruit = function(fruit) { 
    return $http.get('http://example.com/get-token').success(function(token) { 
     return $http({ 
      method: 'POST', 
      url: 'http://example.com/save-fruit', 
      headers: { 'X-CSRF-Token': token }, 
      data: { fruit: fruit } 
     }); 
    }); 
    } 
} 

在這一點上,代碼工作正常。我能夠「保存一些水果」,它通過GET爲自己獲取一個令牌,然後通過POST發送數據,並且所有內容都保存在雲中,非常棒。

要調用這個服務,我用這樣的代碼:

var fruit = { name: 'Apple', color: 'red' }; 
farm.saveFruit(fruit).success(function(result) { 
    console.log(result); 
}); 

然而,console.log()總是打印出$httpGET的結果,而不是POST

如何在致電saveFruit時如何獲得$httpPOST呼叫的結果?

回答

2

success()不允許鏈接承諾。使用真實的東西:then()

return $http.get('http://example.com/get-token').then(function(response) { 
    return $http({ 
    method: 'POST', 
    url: 'http://example.com/save-fruit', 
    headers: { 'X-CSRF-Token': response.data }, 
    data: { fruit: fruit } 
    }); 
}).then(function(response) { 
    return response.data; 
}); 

var fruit = { name: 'Apple', color: 'red' }; 
farm.saveFruit(fruit).then(function(result) { 
    console.log(result); 
}); 
3

使用.success.error方法$http打破承諾鏈。這是無證的,可以被視爲一個錯誤。

爲了延續承諾鏈,請使用.then(和.catch,根據需要)。

return $http.get('http://example.com/get-token').then(function(response) { 
    return $http({ 
     method: 'POST', 
     url: 'http://example.com/save-fruit', 
     headers: { 'X-CSRF-Token': response.data }, 
     data: { fruit: fruit } 
    }); 
}); 
相關問題