2017-07-25 63 views
1

角異步調用沒有結束while循環如預期

var app = angular.module('myApp', []); 
 
    app.controller('myCtrl', function($scope, $http) { 
 
    for(var i=0;i<2;i++){ 
 
     //var temp; 
 
     $http.get("https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js") 
 
     .then(function(response) { 
 
      console.log("inside"); 
 
     // temp=10; 
 
     }); 
 
     //while(temp!=10){} 
 
     console.log("outside")} 
 
    });
<!DOCTYPE html> 
 
<html ng-app="myApp" ng-controller="myCtrl"> 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script> 
 
</html>

在這段代碼中,我想只有經過打印,使打印,意味着除非我得到我想要的響應循環等待,然後去第二個循環,因爲我已經定義了一個變量temp,並且我正在運行一個循環,直到它的值變爲10,但即使在得到響應(如此評論)並將temp值設置爲10. 請幫忙

+0

你的意思是你想一次接一次地執行'get'調用3次嗎? –

+0

我想循環等待,直到它得到響應,然後去第二個循環,但它是連續3次,然後我得到的迴應 – Abhishek

+0

它應該像內部外部內部外部控制檯 – Abhishek

回答

1

您可以先將承諾保存在變量中,然後在承諾成功的情況下在控制檯外部執行。這將確保一旦內部承諾解決,外部將被打印。

var app = angular.module('myApp', []); 
 
    app.controller('myCtrl', function($scope, $http) { 
 
    for(var i=0;i<2;i++){ 
 
     //var temp; 
 
     var q=$http.get("https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js") 
 
     .then(function(response) { 
 
      console.log("inside"); 
 
     temp=10; 
 
     }); 
 
     q.then(function(res){ 
 
     while(temp!=10){} 
 
     console.log("outside") 
 
     }) 
 
     } 
 
    });
<!DOCTYPE html> 
 
<html ng-app="myApp" ng-controller="myCtrl"> 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script> 
 
</html>

在下面撥弄的想法可以,如果你想抽象的代碼轉換成不同功能使用,然後遞歸調用它。

工作小提琴http://jsfiddle.net/rmu6wuo8/1/

+0

我想,OP想按順序調用他的循環,比如1 => 2 => 3.這意味着第二個Ajax應該在第一個完成之後調用並且在第二個完成之後調用第三個完成 –

+0

'while(temp!= 10){}'in您的代碼可能會讓瀏覽器凍結一段時間。在這種情況下,你應該'setInterval' – huydq5000

+0

@PankajParkar如果它的順序,然後他可以使用上面的東西,就像鏈接承諾 – Vivz

0

當我到了你的權利,你想,直到你得到一個特定的值重複的請求。也許這會爲你工作https://jsfiddle.net/jpf4c24m/2/

var app = angular.module('myApp', []); 
app.controller('myCtrl', function($scope, $http, $q) { 

    $scope.request = function request(object) { 
    var counter = 0; 
    var deferred = $q.defer(); 

    var httpConfig = { 
     method: 'GET', 
     url: '/echo/json' 
    } 

    var doRequest = function() { 
     counter++; 
     var self = this, 
     args = arguments; 
     $http(httpConfig). 
     success(function(data, status) { 
     if (data.key == 'your_droid') { 
      deferred.resolve('Woohoo!'); 

     } else { 
      console.log('Not the droids you are looking for..'); 
      //this will re-call doRequest(); 
      args.callee.apply(self); 
     } 
     }). 
     error(function(data, status) { 
     //just fail already, it's not working 
     if (counter > 5) { 
      return deferred.reject('Couldnt reach server this time...'); 
     } 

     //this will re-call doRequest(); 
     args.callee.apply(self); 
     }); 

    } 

    doRequest(); 

    return deferred.promise; 
    } 

    $scope.request(); 
}); 

answer上心。