我有一个方法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并存储它(感谢所有),但它需要比执行下一个操作所花费的时间更长的时间(此处未提供)。在确定身份证明之前,我可以暂停该操作吗?
答案 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;