正如标题所说,我想向服务器发送$ http.get请求,直到返回的结果符合条件。
这就是我的尝试:
var searchComplete = false;
var sendGetReq = true;
while(!searchComplete) // #2 and then jumps here
{
if(sendGetReq)
{
sendGetReq = false; // #1 execution reaches here
$http.get('/user/getCondition', {params: {condition: $scope.condition}).
success(function (condition, status, headers, config) {
...
...
if(condition)
{ searchComplete = true; }
else
{ sendGetReq = true; }
}
}
然而,$ http.get请求永远不会发生。永远不会达到这种说法。当我调试时,我看到执行将转到sendGetReq=false
,然后跳转到while(!searchComplete)
。 GET请求永远不会被发送。
请有人解释一下:
谢谢。
答案 0 :(得分:3)
为什么不将它们全部放在一个函数中并在条件满足时自行调用?像这样你应该使用.then而不是.success:
$scope.load = function(){
$http.get('/user/getCondition', {params: {condition: $scope.condition}).
then(function (condition, status, headers, config) {
if (condition){
$scope.load();
}
});
}
希望有帮助=)
答案 1 :(得分:2)
不要使用while (true)
,特别是在JS中。
JS在一个线程中工作。 $http.get
永远不会运行,因为你的主线程在你的无限循环中停滞不前,并且没有机会让其他线程运行。
<强>更新强>
function getHttpPromise() {
return $http.get('/user/getCondition', {params: {condition: $scope.condition}).
success(function (condition, status, headers, config) {
...
...
if(condition)
return true;//or any result you want to resolve
else
return getHttpPromise();
}
}
getHttpPromise
函数返回promise,它将在condition
上解析,在其他情况下,它会继续等待get get请求。
要使用它,请运行以下代码。
getHttpPromise().then(function (result) {
// Will be called only when condition will be successful
});
答案 2 :(得分:2)
$http.get
是异步调用,它会在服务器的响应中遇到成功或错误(两者都被弃用,然后使用)功能。当函数到达此行时
sendGetReq = false; // #1 execution reaches here
它进行$http.get
调用(这是异步),然后将控件移动到下一次迭代。这是异步调用的主要目的。
如果要进行连续调用,可以在函数中编写$http.get
调用,并使用Angular JS的interval
服务调用该函数。
$scope.func = function(){
if(condition)
{
$http.get....
}
}
$interval($scope.func, 1000)
其中1000是调用函数的时间间隔(以毫秒为单位)
答案 3 :(得分:1)
尝试在控制器中注入$interval
var startInterval = $interval(function(){
var searchComplete = false;
var sendGetReq = true;
sendGetReq = false; // #1 execution reaches here
$http.get('/user/getCondition', {params: {condition: $scope.condition}).
success(function (condition, status, headers, config) {
if(condition)
{ searchComplete = true;
$scope.stopInterval();
}
else
{ sendGetReq = true; }
})
},1000)
$scope.stopInterval = function(){
$interval.cancel(startInterval)
}
答案 4 :(得分:1)
正如安德鲁所说,它应该是递归的,在你的情况下使用.then。要使其递归,将$ http服务封装在函数
中.controller('YourController', function($http) {
this.sendGetReq= function(data) {
$http.get('/user/getCondition', {params: {condition: data.condition}).
.then(function(res) {
if (res.condition) {
//finish your search
} else {
//set newdata somehow
this.sendGetReq(newdata);
}
}
};
});