javascript - 如何同步运行嵌套循环?

标签 javascript for-loop asynchronous nested-loops

我正在编写一个简单的脚本,一次将一个字符打印到屏幕上。

我这样做是为了让函数(我称之为 slowPrint )可以接收字符串数组。数组中的每个元素代表一条消息。

这是我到目前为止的代码:

但是,我没有得到预期的输出。 我怀疑这部分是由于代码的异步性质,尽管我对正在发生的事情以及如何修复它没有完全清晰的了解。

首先,<br />标签在任何消息之前打印,这告诉我外层循环在嵌套循环开始之前就已经完成。

但是,当嵌套循环开始时,数组中的每个字符串将相隔一秒打印,但会完整打印而不是逐个字符

我错过了什么?

此外,有人可以解释一下 setTimeout 的以下行为吗?方法?

场景 1:当我将第二个参数设置为 i * 1000 时,第二个字符串在另一个字符串后一秒打印(同样,整个字符串而不是逐个字符)

     const messages = [
      "all systems are operational",
      "you may proceed"
    ];

    function slowPrint(args) {

      let screen = document.getElementById('screen');

      for (let i = 0; i < args.length; i++) {

        let message = args[i];

        for (let j = 0; j < message.length; j++) {
          setTimeout(function () {
            screen.innerHTML += message[j];
          }, i * 1000);
        }

        screen.innerHTML += '<br />';

      }

    }

    slowPrint(messages)
<div id="screen"></div>

场景 2:当我将第二个参数设置为 j * 1000 时,输出完全出乎意料:每隔一个字符以 2 个为一组打印,但顺序难以理解;只打印最后一个参数的最后一个单词,就像其他所有内容一样。

场景 3:当我将第二个参数设置为 1000 时,一秒后打印数组中的所有字符串。

发生了什么?

最佳答案

该视频是 js 如何在浏览器中工作的最佳解释之一:here

基本上,您在 setTimeout 回调中放入的任何内容都会在您传递给第二个参数的毫秒数内被搁置。然后将其放入回调队列中,直到调用堆栈为空并且它是队列中的下一项

如果您将代码复制并粘贴到 http://latentflip.com/loupe/ 中,您将看到它在幕后的实际运行情况

关于javascript - 如何同步运行嵌套循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51105984/

相关文章:

c - 在 C 中使用 isdigits 、 isalpha 和 ispunct

javascript - 如何使用多个 XMLHttpRequest.responseText 值?

javascript - 如何异步获取响应文本?

JavaScript 函数在使用 header() 后不会运行,但如果不使用 header() 则运行(在 php 中)

javascript - CoffeeScript Promise 中的 for 循环

Javascript 委托(delegate)最佳实践

java - 在 Vb.net 中使用 If-Statement 作为 For-Loop 的测试条件

javascript - 如何在 jQuery 1.8.x 中链接一系列延迟函数?

javascript - 仅当表单成功提交时的 jQuery 事件

javascript - JavaScript 文件顶部的 "format register"字符串是什么?