2014-04-21 56 views
3

我很困擾現在開發一個應用程序。我想要做的是在提交時通過ng-click將執行以下任務:如何在angularjs上實現一個do while while循環

  1. 生成一個5位數的隨機數。
  2. 這個隨機數將在數據庫中驗證(如果存在)。
  3. 如果它存在,它將生成另一個數字,然後再次驗證,直到數值返回到零。

爲1號我已經有這樣的:

var gRandomNum = function(){ 
     var snumRand = Math.floor((Math.random()*10000)+1); 
     var numRand = snumRand.toString(); 
     var str_f = numRand.length; 

     if(str_f == 1){ 
      str_final = "0000" + numRand; 
     } else if(str_f == 2){ 
      str_final = "000" + numRand; 
     } else if(str_f == 3){ 
      str_final = "00" + numRand; 
     } else if(str_f == 4){ 
      str_final = "0" + numRand; 
     } else { 
      str_final = numRand; 
     } 
     return str_final; 

    } 

爲2號

var validataRandNum = function(pdata){ 
    return $http.get('api/cntTc/'+pdata). 
       success(function(data){ 
       return data.tc_count; 
       }); 
} 

爲3號

do{ 
    var pdata = gRandomNum(); 
    var ifValid = validataRandNum(pdata); 
} while(ifValid < 0); 

下面是它看起來像在我的範圍功能

$scope.ok = function(){ 
    do{ 
     var pdata = gRandomNum(); 
     var ifValid = validataRandNum(pdata); 
    } while(ifValid < 0); 

} 

當我試圖驗證ifValid的價值時,我所得到的是未定義的,但是當我再次單擊時,該值將顯示出來,但它是來自最後點擊的值。我試圖實現一個承諾,但卻被挫敗在如何在承諾中實現它。如果你能提供一個能夠做到這一點的代碼,那將會很棒。

回答

4

有什麼辦法可以將它移到服務器端嗎?

堅持到客戶端上這樣做,也許你可以嘗試有validateRandNum()調用自身遞歸(但考慮投入一定的侷限性,因此不會永遠持續下去)...

var validataRandNum = function(getRandNumFunc, deferred){ 
    deferred = deferred || $q.defer(); 
    var pdata = getRandNumFunc(); 
    $http.get('api/cntTc/'+pdata). 
       success(function(data){ 
        if (data.tc_count < 0) { 
         validataRandNum(getRandNumFunc, deferred); 
        } else { 
         deferred.resolve(data.tc_count); 
        } 
       }); 
    return deferred.promise; 
}; 

$scope.ok = function(){ 
    validataRandNum(gRandomNum).then(function (tc_count) { 
     $scope.tc_count = tc_count; 
    }); 
};