如何从一个在AngularJS中调用$ http.get的函数返回一个promise?

时间:2014-01-29 12:59:30

标签: javascript angularjs

我有以下功能:

   getX: function ($scope) {
       $http.get('/api/X/GetSelect')
           .success(function (data) {
               ...
               ...
           })
           .error(function (data) {
               ...
           });
   },

我希望这总是在.success块中执行操作,但我希望它也能返回 一个承诺,以便我可以这样称呼:

getX($scope)
   .then( function () {
       doNextThing();
}

有人可以通过告诉我如何编码来帮助回复承诺吗?

4 个答案:

答案 0 :(得分:5)

您只需在$ http.get()方法之前添加return语句。这将回报承诺。

示例:

 return $http.get('/api/X/GetSelect')
       .success(function (data) {
           ...
           ...
       })
       .error(function (data) {
           ...
       });

答案 1 :(得分:3)

很简单,你自己回复一个承诺。您需要为此注入$qtake a look at the docs for more information)。

然后您可以将代码更新为:

getX: function ($scope) {
    var defer = $q.defer();
    $http.get('/api/X/GetSelect').success(function (data) {
        ...
        ...
        defer.resolve();
    }).error(function (data) {
        ...
        defer.reject();
    });
    return defer.promise;
}

答案 2 :(得分:2)

function getX($scope)
{
    var defered = $q.defer();
     $http.get('/api/X/GetSelect')
               .success(function (data) {
                   defered.resolve(data);
                   ...
               })
               .error(function (data) {
                   defered.reject();
               });
    return defered.promise();
    }

您需要在控制器中注入$ q。

答案 3 :(得分:1)

您可能需要使用延期承诺。这就是你如何做到的。

var functionA = function () {
    var deferred = $q.defer();
    $http.get('url here').
          success(function (response) {
              deferred.resolve(response);
          }).
          error(function (response) {
          });
    return deferred.promise;
}

现在调用functionA应该会返回一个可以根据需要执行操作的承诺。