Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使函数在AngularJS中等待$http响应_Angularjs_Deferred_Angular Promise - Fatal编程技术网

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

使函数在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并存储它(谢谢大家),但是它比

我有一个方法seatClicked(),它调用getUserID()来获取与会话“user”对应的用户id。有一个表包含用户名和用户id(唯一)。下面是seatClicked()的定义

这是getUserID()的定义

$http.then()返回的变量'results'始终未定义,而如果使用$http.success(),则可以检索用户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);         
})