javascript - for 循环内的 setTimeout 未按预期运行

标签 javascript jquery settimeout

我正在创建一个函数,当您按下一个按钮时,它会一次弹出一个随机符号,中间会有延迟,然后在所有符号加载完毕后变为一个可读的单词。我不能延迟工作。我还没有添加将符号变成可读单词的部分,因为我无法完成它。

//Brute Force
function work() {
    setTimeout(function() {
        var $rand = Math.ceil(Math.random() * 10);
        $('#txtBrute').append($sym[$rand]);
    },1000);
};
var i = 1;
var $sym = [1,9,"%","$",")",">","@","?","-","|",7];
$('#btnBrute').click(function() {
    var $pass = "password123";
    $('#txtBrute').html("");
    for(i = 1; i <= $pass.length; i++) {
        work();
    };
});

最佳答案

问题是因为您在循环中调用 work(),因此所有计时器都会立即执行。

除此之外,您还可以使 work() 递归。您可以使用密码的长度作为每次递归的递减值。试试这个:

var timeout;
var $sym = [1, 9, "%", "$", ")", ">", "@", "?", "-", "|", 7];

function work(length) {
  timeout = setTimeout(function() {
    var $rand = Math.ceil(Math.random() * 10);
    $('#txtBrute').append($sym[$rand]);
    --length != 0 && work(length);
  }, 1000);
};

$('#btnBrute').click(function() {
  clearTimeout(timeout);
  var pass = "password123";
  $('#txtBrute').html("");
  work(pass.length);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="btnBrute">Go</button>
<div id="txtBrute"></div>

另请注意,我添加了一个 clearTimeout() 调用,如果有人决定在递归循环仍在运行时继续按下按钮。

关于javascript - for 循环内的 setTimeout 未按预期运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41170101/

相关文章:

JavaScript:新日期(Date.parse ("A 49"))

javascript -+++ 和 --- 在 JavaScript 中是什么意思?

javascript - 为什么一段 Javascript 只有当我在它下面有一个警告时才有效?

javascript - 具有潜在变量范围问题的 Jquery 动画问题?

javascript - setInterval/setTimeout 可能会导致页面重新加载

javascript - 在 PhantomJS 中等待没有 setTimeout 的元素

javascript - react enzyme 试验

javascript - Materialize css select 无法处理 JS 错误

javascript - 在 MVC 中将分部 View 渲染到布局页面的最佳方式是什么?

javascript - 如何删除标记 googlemap $.getjson