在AngularJS中使函数等待$ http响应

时间:2015-06-17 10:14:41

标签: angularjs deferred angular-promise

我有一个方法seatClicked(),它调用getUserID()来获取对应于会话属性' user'的用户ID。有一个表包含用户名和用户ID(唯一)。以下是seatClicked()

的定义
$scope.seatClicked = function() {
    promise = $scope.getUserID();
    promise.then(function(results){
        $scope.seatID.userID = results; // store the user id in $scope.seatID.userID
    });
}

这是getUserID()

的定义
$scope.getUserID = function() {
    var deferred = $q.defer();
    $http({
        method : 'POST',
        url : 'http://localhost:8080/AirlineApp/getUserID',
        headers : {
            'Content-Type' : 'application/json'
        }
    }).then(function(data){
        alert("userID:"+data)
         deferred.resolve(data);
    })
    return deferred.promise;
};

变量'结果' $ http.then()返回的内容总是未定义,而如果我使用$ http.success(),我可以检索用户ID。

我想在进一步处理之前获取用户ID。有没有办法让函数等到从数据库中提取数据? 附:我也试过回调,没有运气。

  

编辑:我能够获取id并存储它(感谢所有),但它需要比执行下一个操作所花费的时间更长的时间(此处未提供)。在确定身份证明之前,我可以暂停该操作吗?

2 个答案:

答案 0 :(得分:4)

我们在项目中所做的,为任何REST调用添加了PromiseUtils服务

.service("PromiseUtils", function($q) {
    return {
        getPromiseHttpResult: function (httpPromise) {
            var deferred = $q.defer();
            httpPromise.success(function (data) {
                deferred.resolve(data);
            }).error(function () {
                deferred.reject(arguments);
            });
            return deferred.promise;
        }
    }
})

并使用它很好很容易

var anyCall  = $http({
        method: 'POST',
        url: 'http://localhost:8080/AirlineApp/getUserID',
        headers: {
            'Content-Type': 'application/json'
        }
    });

PromiseUtils.getPromiseHttpResult(anyCall).then(function(result){
   console.log("result", result);
})

PromiseUtils.getPromiseHttpResult($http.get('/api/get/call'))
.then(function(result){
    console.log("result", result);
})

PromiseUtils.getPromiseHttpResult($http.post('/api/post/call', data))
.then(function(result){
   console.log("result", result);
})

如果你需要error()函数,只需添加第二个参数

PromiseUtils.getPromiseHttpResult($http.get('/api/get/call'))
.then(function(result){
    console.log("result", result);
}, function (arguments) {
    console.log("fail", arguments);         
})

答案 1 :(得分:0)

$ http会返回一个与标准承诺不同的特殊承诺,例如https://github.com/promises-aplus/promises-spec

如果你使用$ http,你需要检索你的数据:

$http
  .success(success) 
  .error(error) ...

但是您可以使用$ q包装$ http承诺来使用标准承诺,如下所示:

var defer = $q.defer();
var http = $http({
    url: SharedFactory.endPoint + '/stats',
    method: 'GET',
    params: params
});

http.success(function(stats) {
      defer.resolve(stats);
    })
    .error(function() {
      defer.reject("Failed to get stats");
    });

  return defer.promise;