即使条件为假,循环内的服务调用也不会停止循环
service call inside loop doesn't stops loop even if condition is false
如果 shouldPermit
变为 true
,我想停止对 getModelData
的重复调用。但是下面的代码总是在控制台中为每个 newlySelectedUsers
.
打印 why I got printed forEach newlySelectedUsers
var shouldPermit = false;
angular.forEach(newlySelectedUsers, function(value, key) {
if(!shouldPermit) {
console.log("why I got printed forEach newlySelectedUsers")
userService.getModelData($scope.$root.test[value].id)
.success(function (data) {
if(lodash.isEmpty(data)) {
shouldPermit = true;
$scope.insertSaving();
}
});
}
});
一旦 shouldPermit
变为真,如何停止对 getModelData
的调用?
是因为异步。第二次迭代不会等待第一次迭代调用的 userService.getModelData()
完成。因此,您甚至在第一次迭代 userService.getModelData()
的成功函数运行之前就收到了控制台消息,您将 shouldPermit
更改为 true.
相反,您只需将 shouldPermit = true;
移至顶部即可解决问题。
var shouldPermit = false;
angular.forEach(newlySelectedUsers, function(value, key) {
if(!shouldPermit)
{
console.log("why I got printed forEach newlySelectedUsers");
shouldPermit = true; <--- Moved from success function
userService.getModelData($scope.$root.test[value].id) <--- Async Call
.success(function (data) {
if(lodash.isEmpty(data))
{
$scope.insertSaving();
}
});
}
});
那是因为所有 http 请求运行 异步。那个蜜蜂说你的迭代 运行s 比服务查找(在你的情况下)一个空数据变量所需的时间快。
一个选项是递归调用http请求:
const totalNewlySelectedUsers = newlySelectedUsers.length;
function getUser(idx) {
let value = newlySelectedUsers[idx];
userService.getModelData($scope.$root.test[value].id)
.success(function (data) {
if (lodash.isEmpty(data))
$scope.insertSaving();
return;
}
if(idx === totalNewlySelectedUsers) return;
getUser(idx + 1);
});
}
getUser(0);
如果 shouldPermit
变为 true
,我想停止对 getModelData
的重复调用。但是下面的代码总是在控制台中为每个 newlySelectedUsers
.
why I got printed forEach newlySelectedUsers
var shouldPermit = false;
angular.forEach(newlySelectedUsers, function(value, key) {
if(!shouldPermit) {
console.log("why I got printed forEach newlySelectedUsers")
userService.getModelData($scope.$root.test[value].id)
.success(function (data) {
if(lodash.isEmpty(data)) {
shouldPermit = true;
$scope.insertSaving();
}
});
}
});
一旦 shouldPermit
变为真,如何停止对 getModelData
的调用?
是因为异步。第二次迭代不会等待第一次迭代调用的 userService.getModelData()
完成。因此,您甚至在第一次迭代 userService.getModelData()
的成功函数运行之前就收到了控制台消息,您将 shouldPermit
更改为 true.
相反,您只需将 shouldPermit = true;
移至顶部即可解决问题。
var shouldPermit = false;
angular.forEach(newlySelectedUsers, function(value, key) {
if(!shouldPermit)
{
console.log("why I got printed forEach newlySelectedUsers");
shouldPermit = true; <--- Moved from success function
userService.getModelData($scope.$root.test[value].id) <--- Async Call
.success(function (data) {
if(lodash.isEmpty(data))
{
$scope.insertSaving();
}
});
}
});
那是因为所有 http 请求运行 异步。那个蜜蜂说你的迭代 运行s 比服务查找(在你的情况下)一个空数据变量所需的时间快。
一个选项是递归调用http请求:
const totalNewlySelectedUsers = newlySelectedUsers.length;
function getUser(idx) {
let value = newlySelectedUsers[idx];
userService.getModelData($scope.$root.test[value].id)
.success(function (data) {
if (lodash.isEmpty(data))
$scope.insertSaving();
return;
}
if(idx === totalNewlySelectedUsers) return;
getUser(idx + 1);
});
}
getUser(0);