我的控制器由一个函数组成,该函数对服务进行两次函数调用,并从视图中收集一些范围值。
$scope.sendValues = function () {
MyService.function1($scope.value1, $scope.value2);
for(var i = 0; i < $scope.arr.length; i++) {
$scope.value3 = $(".input" + i).val();
MyService.function2($scope.value3);
}
};
两个服务函数都发出http请求,它们看起来与此类似:
var tempID = 0;
var function1 = function (value1, value2) {
return $http({
method: 'POST',
url: "someUrl",
data: {
valeu1: value1,
value2: value2
}
}).success(function (response) {
tempID = response.data.id;
});
};
现在第二个函数需要来自function1的值“tempID”。
var function2 = function (value3) {
return $http({
method: 'POST',
url: "anotherURL",
data: {
value3: value3,
tempID: tempID
}
});
};
问题是有时function2在function1完成之前运行,这导致tempID是声明的值0.如何在function2运行之前确保function1完成?我知道我可以把function2放在function1中成功/完成,但是我如何获得在控制器函数中循环的视图值。
答案 0 :(得分:2)
您可以使用承诺
var function1 = function (value1, value2) {
return $http({
method: 'POST',
url: "someUrl",
data: {
valeu1: value1,
value2: value2
}
}).then(function (response) {
tempID = response.data.id;
retrun tempID;
});
};
var function2 = function (value3, tempID) {
return $http({
method: 'POST',
url: "anotherURL",
data: {
value3: value3,
tempID: tempID
}
});
};
你会这样打电话
function1('some value1', 'some value2').then(function(id){
function2('your value 3', id).then(function(resp){
// whatever you want to do with this response
});
});
答案 1 :(得分:0)
回调本质上是异步的。很明显,有时2将在1之前运行。要解决问题,请将这些函数包含在闭包中。闭包将按顺序执行这些功能,即同步。
答案 2 :(得分:0)
这应该有效。但对于优雅,承诺,回调可能是一个更好的设计。
var function1 = function (value1, value2) {
return $http({
method: 'POST',
url: "someUrl",
data: {
valeu1: value1,
value2: value2
}
}).success(function (response) {
tempID = response.data.id;
for(var i = 0; i < $scope.arr.length; i++) {
$scope.value3 = $(".input" + i).val();
MyService.function2($scope.value3);
}
});
};