2017-05-30 1 views
0

私のコードは以下の通りです。ループの長さが0になるまで、配列をループし、各繰り返しでランダムな項目を削除しています。スリープまたは遅延を追加したい各反復が、私はangular1.xまたはプレーン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); 

} 

答えて

1

あなたはミリ秒単位で(たsetInterval()メソッドは、関数を呼び出すか、指定した間隔で表現 を評価

その目的のためにsetIntervalを使用することができます)。

setInterval()メソッドは、 clearInterval()が呼び出されるまで、またはウィンドウが閉じられるまで関数を呼び出し続けます。

setInterval()によって返されたID値は、 clearInterval()メソッドのパラメータとして使用されます。

ヒント:1000 ms = 1秒。

ヒント:関数を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 
0

あなたはsetIntervalを使用することができますか?

var array = [1, 2, 3, 4, 5, 6, 7] 
 
var interval = null; 
 

 

 
function removeArray() { 
 
    random = Math.floor(Math.random() * array.length); 
 
    array.splice(random, 1); 
 
    console.log(array); 
 

 
    if (array.length == 0) { 
 
    clearInterval(interval); 
 
    } 
 
} 
 

 
interval = setInterval(removeArray, 1000);
.as-console-wrapper { 
 
    max-height: 100% !important; 
 
    top: 0; 
 
}

0

EDIT - >有益なコメントの後、私は$タイムアウトが最良の答えではありません実現しています。また、解決された約束を返し

(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>

$interval:だから私は、間隔を使用することについて、ここで他の回答に同意するだろうが、私はまだ角度の組み込み$intervalサービスを使用することをお勧めし最後の反復が完了しているので、間隔が完了した後に実行したい非同期作業は簡単に処理できます。


前の答え:

角度$timeoutサービスを提供しています。コントローラに依存関係として注入した後:whileループの各繰り返しの間に500ミリ秒間停止します。

+0

私は元の質問でwhileループに言及していましたが、あなたの答えにはwhileループがなく、何の出口戦略 –

+0

のいずれか、私は明確にするためのコードでそれを追加します –

+0

私はちょうどそれがwhileループの実行を一時停止するとは思わない:p –

0

あなたが質問で述べたSOの回答もうまくいきます。スニペットを参照してください。

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(); 
 
});
<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>

関連する問題