在角度函数中不等待完成第一个函数执行

时间:2016-01-30 10:39:18

标签: javascript angularjs

我的函数没有等到完成早期的函数执行并且它正在完成。

我的代码是我做错了一些事情:

$scope.abc1 = function(){
 var arrayJson = [{'name':'max','age':'12'},{'name':'tax','age':'16'}]
 for(var i=0; i<arratJson.length;i++){
  var getAddress = $scope.xyz(arratJson[i].name);
    }
  $scope.createBody();

 };
 $scope.createBody = function(){
 //some more code here
 };
 $scope.xyz = function(name){
    $http({
            method: 'GET',
            url: 'rest/address',
            type:'json',
            headers:{'action':'single','name':name},  
            }).success(function(response){
             return response;
            }).error(function(response){

            });
   };

所以在这里它不是等待获取地址而不是它向下移动所以如何等待完成循环然后调用不同的函数。 在$ scope.xyz()函数之前调用的createBody函数返回如何等待循环结束的值

5 个答案:

答案 0 :(得分:2)

由于执行的异步性,这是预期的。你应该使用回调来避免这个问题。

答案 1 :(得分:1)

您应该使用$q服务 首先将所有$http次调用存储在一个数组中,然后使用$q.all(array)创建一个在所有$http承诺解决后解析的承诺。

e.g:

$scope.abc1 = function(){
  var arrayJson = [{'name':'max','age':'12'},{'name':'tax','age':'16'}]
  var promises = [];
  for(var i=0; i<arratJson.length;i++){
    promises.push($scope.xyz(arratJson[i].name));
  }

  $q.all(promises).then($scope.createBody);

};

根据这项新承诺的决心,您可以拨打createBody功能。

要实现此功能,您还应该将success上的$scope.xyz回调更改为then回调并返回承诺。

e.g:

$scope.xyz = function(name){
  return $http({
    method: 'GET',
    url: 'rest/address',
    type:'json',
    headers:{'action':'single','name':name},  
  }).then(function(response){
    return response;
  })["catch"](function(response){

  });
};

更新

如果您不关心所有来电是否成功,请替换:

$q.all(promises).then($scope.createBody);

使用:

$q.all(promises)["finally"]($scope.createBody);

PS:请注意,在finally回调中,您获取每次通话的返回值,而在then和数组将作为参数传递给回调函数,该函数在每个位置保存每个$http调用的返回值。

答案 2 :(得分:0)

有两种方法可以实现这个目标

1)使用async:false

2)需要使用回调

选择你的方式并享受!

答案 3 :(得分:0)

你应该如何在javascript中使用promises。

$ http是一个异步函数。您必须在$ scope.xyz函数中返回$ http结果并使用then,success,error function callbacks。

示例:

function xyz() {
   return $http(...);
}

xyz().then(function(data) {
    address = data.data.address; // in your json dto format
})

更多信息https://docs.angularjs.org/api/ng/service/ $ http

希望这有帮助! 问候

答案 4 :(得分:0)

您可以使用Angular承诺。

将承诺状态包含在具有延迟值的自创建对象中,具有valueOftoString方法。最后两种方法允许使用算术,字符串和比较运算符。

具有延迟值的对象:

 var DeferredValue = function(initial){
    var self = this;
    self._value = initial; 
    var deferred = $q.defer();
    self.$promise = deferred.promise;
    self.$resolved = false;
    self.$resolve = function(value){
      deferred.resolve(value);
    }
    self.$promise.then(function(v){
      self._value = v;
      deferred = null;
      self.$resolved = true;
      delete self.$resolve;
      return self.$promise;
    });
  }

  DeferredValue.prototype = {
    constructor: DeferredValue,
    valueOf: function(){
      return this._value
    },
    toString: function(){
      return this._value.toString()
    }
  }

在ASYNC函数中返回此对象,并在检索数据后解析它们:

var getValue = function(){
  var value = new DeferredValue();
  $timeout(function(){
    value.$resolve(Math.floor(Math.random() * 10))
  },1500);
  return value;
}

Plunker example