使用链式承诺($ q)来赚取$ http

时间:2014-09-30 16:45:54

标签: angularjs angular-promise

我有想要“重新验证”的数据。所以我需要发出一个get请求,保存回调中的数据,删除当前数据,然后用回调中的数据发帖。

我需要以某种方式使用$ q。

也许我完全不在了,但这是我尝试过的。

$scope.reSaveBIM = function(){

  var defer = $q.defer();

  defer.promise
    .then(function(){
      $http.get('/api/bim/' + $scope.activePartOfBim._id)
        .success(function(fullBIM){
          console.log(fullBIM); //Defined
          return fullBIM;
        }
      );
    })
    .then(function(fullBIM){
      console.log(fullBIM); //Undefined
      $http.delete('/api/bim/' + $scope.activePartOfBim._id);
      return fullBIM
    })
    .then(function(fullBIM){
      $http.post('/api/bim', {bim:JSON.stringify(fullBIM)});
    });

  defer.resolve()

};

来自第一个回调的数据不会在链接中返回。我是在正确的轨道上吗?我也尝试使用$ q.all但失败了。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

无需创建额外的$q.defer对象,您可以简单地链接$http返回的承诺...

$scope.reSaveBIM = function() {
    return $http.get('/api/bim/' + $scope.activePartOfBim._id).then(function(response) {
        var fullBIM = response.data;
        return fullBIM;
    }).then(function(fullBIM) {
        return $http.delete('/api/bim/' + $scope.activePartOfBim._id).then(function() {
            return fullBIM;
        });
    }).then(function(fullBIM) {
        return $http.post('/api/bim', { bim:JSON.stringify(fullBIM) }).then(function() {
            return fullBIM;
        });
    }).catch(function(response) {
        // return an error message using throw
        throw "Something went wrong - Status " + response.status;
    });
};

要打电话......

$scope.reSaveBIM().then(function(fullBIM) {
    console.log('success! fullBIM: ', fullBIM);
}, function(errorMsg) {
    console.log(errorMsg);
});

答案 1 :(得分:0)

AngularJS的$ http已经包装了$ q服务。 From the documentation

  

$ http API基于$ q服务公开的延迟/承诺API。

基本上你的问题是$ http使用与你用$ q创建的承诺不同的承诺。你需要链接你的$ http调用来做同样的事情。事实是,你已经使用了来自$ q的承诺。

此外,您可以通过声明函数并将它们作为变量传递来展平它。

$http.get('/api/bim/' + $scope.activePartOfBim._id)
    .success(firstSuccessFunction);

var firstResponse;
var firstSuccessFunction = function(fullBIM){
  console.log(fullBIM); //Defined
  firstResponse= fullBIM;
  $http.delete('/api/bim/' + $scope.activePartOfBim._id)
          .success(secondSuccessFunction);
};

var secondSuccessFunction = function(deleteResponse) {
  $http.post('/api/bim', {bim:JSON.stringify(firstResponse)});
};

答案 2 :(得分:0)

你几乎是对的,你不需要defer。而不是success使用then。我认为成功不会带来希望。另外$ then成功回调在data属性中有response.data