在角度函数中不等待完成第一个函数执行
In angular function not waiting to complete first function execution
我的函数没有等待完成早期的函数执行,它正在完成。
我的代码是我做错了一些事情:
$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 函数返回值如何等待循环完成
由于执行的异步性质,这是意料之中的。您应该使用回调来避免此问题。
您应该使用 $q
服务。
首先将所有$http
调用存储在数组中,然后使用 $q.all(array)
创建一个承诺,该承诺在所有承诺都已解析后解析$http
。
例如:
$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
函数。
为此,您还应该将$scope.xyz
上的回调更改为then
回调success
并返回 promise。
例如:
$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
调用的返回值。
有两种方法可以实现这一点
1)使用 async:false
2)需要使用回调
选择你的方式,享受!
你应该如何在 javascript 中 promise 工作。
$http是一个异步函数。您必须返回 $http 结果 $scope.xyz 函数,然后使用成功、错误函数回调。
例:
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
希望这有帮助!regards
你可以使用 Angular 承诺。
将承诺状态包含在具有延迟值的自创建对象中,该对象具有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()
}
}
在 ASYNC 函数中返回此对象,并在检索数据后解析它们:
var getValue = function(){
var value = new DeferredValue();
$timeout(function(){
value.$resolve(Math.floor(Math.random() * 10))
},1500);
return value;
}
普伦克示例
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 而循环只设置php中输入字段中的第一个值
- 将OnClick函数设置为<ul>,最后一个ul是擦除第一个ul-s
- 第一个jquery项目-在函数中使用处理程序来模块化它们
- Javascript 函数在 PHP 中的第一个 while 循环后停止
- MeteorJS-click.increment函数不起作用(您的第一个Meteor应用程序)
- 有人能理解为什么我的jquery函数上下滑动在我的第一个li标签上不能正常工作吗
- 表单只检查提交函数的第一个值
- 如何使keyup()函数只在字段中的第一个keyup上
- 函数仅适用于第一个td's、 但不是针对所有的td's
- 如果我在一个函数中返回两次,第二个会覆盖第一个吗?
- PHP变量正在更新,但javascript函数总是显示第一个值
- 第一个javascript函数调用从未执行
- 为什么当调用一个函数时,第一个this是父对象,但在随后的函数调用中,this是指窗口对象
- 第一个JavaScript函数/链接停止工作
- 使用onchange函数时,选择列表忽略第一个值,PHP, JAVASCRIPT
- 为什么split函数无法获得第一个null
- 如何在第一个 getjson 函数中的另一个 getjson 调用中使用 getjson 响应变量
- 为什么我的 .data() 函数返回 [ 而不是我的数组的第一个值
- 在函数的第一个 else 语句中,使属性等于值的确切目的是什么