2014-04-21 54 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; 
    }); 
};