Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.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/1/angularjs/24.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
Javascript 在角度函数中,不等待完成第一个函数执行_Javascript_Angularjs - Fatal编程技术网

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

Javascript 在角度函数中,不等待完成第一个函数执行,javascript,angularjs,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.createBod

我的函数没有等待完成之前的函数执行,它正在完成

我的代码是我做错了什么:

$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.abc1=函数(){
var arrayJson=[{'name':'max','age':'12'},{'name':'tax','age':'16'}]

对于(var i=0;i这是由于执行的异步性质而预期的。您应该使用回调来避免此问题。

有两种方法可以实现此目的

1) 使用async:false

2) 需要使用回调函数吗


选择你的方式并享受吧!

你应该知道承诺在javascript中是如何工作的

$http是一个异步函数。必须在$scope.xyz函数中返回$http result,然后使用success、error函数回调

例如:

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

xyz().then(function(data) {
    address = data.data.address; // in your json dto format
})
更多信息$http

希望这有帮助! 关于

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

e、 g:

更新 如果您不在乎所有呼叫是否成功,请更换:

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


PS:请记住,在
finally
回调中,不会获得每个调用的返回值,而在
中,则会在回调函数中传递一个数组作为参数,该回调函数在每个位置保存每个
$http
调用的返回值。

可以使用

将承诺状态包含到具有延迟值的自建对象,该对象具有
valueOf
toString
方法。后两种方法允许使用算术、字符串和比较运算符

具有延迟值的对象:

 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()
    }
  }
在异步函数中返回此对象,并在检索数据后解析它们:

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

此处可能存在重复,您只调用一个函数。在此之后是否调用第二个函数?您能给我推荐一个好的示例吗谢谢您的回答..在我的函数中哪里提到async:false;您好,Mayur,只需添加async:false,在类型“json”下或之前,告诉我是否需要更多帮助谢谢您的回答让我试试这个,r埃弗特回到你身边
$q.all(promises)["finally"]($scope.createBody);
 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()
    }
  }
var getValue = function(){
  var value = new DeferredValue();
  $timeout(function(){
    value.$resolve(Math.floor(Math.random() * 10))
  },1500);
  return value;
}