使函数在AngularJS中等待$http响应
我有一个方法seatClicked(),它调用getUserID()来获取与会话“user”对应的用户id。有一个表包含用户名和用户id(唯一)。下面是seatClicked()的定义 这是getUserID()的定义 $http.then()返回的变量'results'始终未定义,而如果使用$http.success(),则可以检索用户id 我想在进一步处理之前获取用户id。函数是否可以等待从数据库中获取数据? 另外,我也试过回电话,运气不好使函数在AngularJS中等待$http响应,angularjs,deferred,angular-promise,Angularjs,Deferred,Angular Promise,我有一个方法seatClicked(),它调用getUserID()来获取与会话“user”对应的用户id。有一个表包含用户名和用户id(唯一)。下面是seatClicked()的定义 这是getUserID()的定义 $http.then()返回的变量'results'始终未定义,而如果使用$http.success(),则可以检索用户id 我想在进一步处理之前获取用户id。函数是否可以等待从数据库中获取数据? 另外,我也试过回电话,运气不好 编辑:我能够获取id并存储它(谢谢大家),但是它比
编辑:我能够获取id并存储它(谢谢大家),但是它比执行下一个操作所花费的时间要长得多(这里没有介绍)。我可以暂停那个操作直到我确定身份吗
$http返回一个特殊的承诺,与这里的标准承诺不同 如果使用$http,则需要如下方式检索数据:
$http
.success(success)
.error(error) ...
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;
但您可以使用标准承诺,在服务中使用$q包装$http承诺,如下所示:
$http
.success(success)
.error(error) ...
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;
我们在项目中所做的,是为任何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);
})
或
如果需要error()函数,只需添加第二个参数即可
PromiseUtils.getPromiseHttpResult($http.get('/api/get/call'))
.then(function(result){
console.log("result", result);
}, function (arguments) {
console.log("fail", arguments);
})
嗨,弗莱文伯特,我刚才也试过标准承诺。当我提醒结果(代码中的统计信息)时,它显示undefined(未定义):(嗨,Dmitri,谢谢你的回复。目前我没有使用任何REST服务。我正在学习angularjs并在后端使用servlet。你能以更简单的方式给出解决方案吗?感谢Swatch angularjs视频课程,you tube或任何其他来源。这是我为你提供的解决方案:)我是从PluralSight视频开始学习的。感谢您的建议:)是否有任何教程或课程侧重于高级方面(或至少高于基础方面)?我能够获取id并存储它,但所花费的时间远远超过执行下一个操作所花费的时间(此处不提供)。我可以暂停该操作直到确定id吗?搜索$q。all()示例在编辑过程中,是的,您可以像这样链接承诺。您确保首先检索您的id,然后使用此id发出其他请求:service.getItemId()。然后(函数(id){})
PromiseUtils.getPromiseHttpResult($http.get('/api/get/call'))
.then(function(result){
console.log("result", result);
}, function (arguments) {
console.log("fail", arguments);
})