最简单的形式我的代码在下面,我循环遍历数组并在每次迭代中删除一个随机项,直到循环长度为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);
}
答案 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;
$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)
你在问题中提到的答案也很有效。请参阅代码段。
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;
答案 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
你看到了吗?这非常有用!
告诉我我是否说过您不想做的事情。
^ _ ^