循环中超时或睡眠

时间:2017-05-30 08:28:07

标签: javascript angularjs timeout

最简单的形式我的代码在下面,我循环遍历数组并在每次迭代中删除一个随机项,直到循环长度为0.我想在每次迭代中添加一个睡眠或延迟,但我是不确定在angular1.x或plain js中实现此目的的最佳方法。

我发现了这个问题What is the JavaScript version of sleep()?,但无法获得最高评价的答案。

任何人都可以帮忙解决这个问题:

while($scope.players.length > 0){

    random = Math.floor(Math.random() * $scope.players.length);
    $scope.players.splice(random, 1);

}

5 个答案:

答案 0 :(得分:1)

您可以将setInterval用于此目的

  

setInterval()方法调用函数或计算表达式   以指定的间隔(以毫秒为单位)。

     

setInterval()方法将继续调用函数直到   调用clearInterval(),或关闭窗口。

     

setInterval()返回的ID值用作参数   clearInterval()方法。

     

提示:1000毫秒= 1秒。

     

提示:仅在指定次数后执行一次函数   毫秒,使用setTimeout()方法。

示例

function _do(){
   if($scope.players.length > 0){

    random = Math.floor(Math.random() * $scope.players.length);
    $scope.players.splice(random, 1);

   } else clearInterval(_loop);
}

var _loop = setInterval(_do,1000); //Sleep for 1 sec

答案 1 :(得分:0)

您可以使用setInterval



.as-console-wrapper {
  max-height: 100% !important;
  top: 0;
}

st_name




答案 2 :(得分:0)

编辑 - >在有用的评论之后,我意识到$ timeout不是最好的答案。所以我在这里同意其他关于使用间隔的答案,但我仍然建议使用Angular的内置$interval服务:



(function() {
  'use strict';

  angular.module('MyApp', []);

  angular
    .module('MyApp')
    .controller('MyCtrl', MyCtrl);

  MyCtrl.$inject = ['$scope', '$interval'];

  function MyCtrl($scope, $interval) {

    $scope.players = ['a', 'b', 'c', 'd', 'e'];
    var INTERVAL_LENGTH = 1000; // This can be however long you want
    var INTERVAL_COUNT = $scope.players.length;

    if (INTERVAL_COUNT > 0) {
      $interval(function() {
        var random = Math.floor(Math.random() * $scope.players.length);
        $scope.players.splice(random, 1);
      }, INTERVAL_LENGTH, INTERVAL_COUNT).then(function() {
        $scope.players = 'done!';
      });
    }
  }
})();

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="MyApp" ng-controller="MyCtrl">
  <span>{{ players }}</span>
</div>
&#13;
&#13;
&#13;

$interval还返回一个在最后一次迭代完成时解析的promise,因此可以轻松处理在间隔完成后要执行的任何异步工作。

上一个回答:

Angular提供$timeout服务。将它作为依赖项注入控制器之后:

var PAUSE_AMOUNT = 500; // This can be however long you want
while($scope.players.length > 0){
    $timeout(function() {
        random = Math.floor(Math.random() * $scope.players.length);
        $scope.players.splice(random, 1);
    }, PAUSE_AMOUNT);
}

这将在while循环的每次迭代之间暂停500 ms。

答案 3 :(得分:0)

你在问题​​中提到的答案也很有效。请参阅代码段。

&#13;
&#13;
var app = angular.module("MyApp", []).controller("MyCtrl", function($scope) {

  $scope.players = ['a', 'b', 'c', 'd', 'a', 'b', 'c', 'd', 'a', 'b', 'c', 'd'];
  var ele = angular.element(document.querySelector('#playersEle'));
  ele.html($scope.players);
  function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
  }

  async function demo() {
    while ($scope.players.length > 0) {
      console.log('Taking a break...');
      await sleep(2000);
      console.log('Two second later');
      random = Math.floor(Math.random() * $scope.players.length);
      $scope.players.splice(random, 1);
      ele.html($scope.players);
    }
  }
  demo();
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<body ng-app="MyApp" ng-controller="MyCtrl">
  <span id="playersEle"></span>
</body>
&#13;
&#13;
&#13;

答案 4 :(得分:0)

使用setInterval函数。
一段时间后,这将继续调用该函数。 示例:

var myFunction = function () {
  //do something
};
setInterval(myFunction, 1000)

在此示例中,它将每1000迷你秒调用myFunction
密钥:

1000 ms = 1 s

您还可以使用以下脚本取消setInterval

//create an variable for the setInterval
var intervalId = setInterval(myFunction, 2500);
//That is 2.5 seconds
//Now to cancel the interval:

clearInterval(intervalId);

使用clearInterval();停止间隔。 在()中输入要停止的时间间隔名称。

调用多个功能或执行某些操作:

要一次调用多个功能或执行其他操作,请使用以下方法:

var intervalId = setInterval(function () {
  //put whatever you want here, I'll put some examples
  callAFunction();
  inputFunction("123Example...");
  alert("Hello!"); 
  //Not a function, just as I said, you can do whatever you want here
  console.log("setInterval Is great"); //Not a function!!!!!!!!!!!!!
  //This is a comment
  /*
    This is
    another
  */
  functionCall();
  //here is the end of this variable
}, 100); //the number is the amount of ms after it loops again

你看到了吗?这非常有用!
告诉我我是否说过您不想做的事情。

^ _ ^