【问题标题】:How to print alphabet from A - Z. Each letter will be taken 3 second for print, only A will take 0 second?如何从 A - Z 打印字母。每个字母需要 3 秒打印,只有 A 需要 0 秒?
【发布时间】:2021-09-22 19:33:59
【问题描述】:

当我尝试通过 for 循环和 setTimeout 方法执行时,得到输出 undefined。然后我尝试了下面的方法

var alphAbet = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']


setTimeout(function loop() {
    console.log(alphAbet.shift());

    if (alphAbet.length){
        setTimeout(loop, 3000);
    }
}, 3000);

A 到 Z,所有字母都在 3 秒后执行。但根据条件字母 A 不会花费任何时间。

【问题讨论】:

  • 有什么问题?
  • 去掉外部的setTimeout。只需定义,然后调用 loop()

标签: javascript arrays function loops if-statement


【解决方案1】:

这样……

const out = document.querySelector('p')

function* AlphaLetter( text )
 {
 for (let letter of text)
   yield letter;
 }

var gen = AlphaLetter('ABCDEFGHIJKLMOPQRSTUVWXYZ') 

out.textContent = gen.next().value 

let refInt = setInterval(()=>
  {
  let l = gen.next()
  if (l.done) clearInterval(refInt)
  else out.textContent += l.value
  },1000)
<p></p>

【讨论】:

  • 已经花费了时间。但是 A 不能花任何时间来执行。
  • @SwadipSinghoRoySoumya 是的,这是编码的内容,A 立即显示,然后每个字母之间有一个延迟,正如您在问题中要求的那样。
【解决方案2】:

你可以让循环调用自己(递归)。

var alphAbet = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']

function loop() {
    console.log(alphAbet.shift());
    if (alphAbet.length) {
        setTimeout(loop, 3000);
    }
}

loop();

【讨论】:

  • 我试过这段代码,但结果是一样的。字母 A 用了 3 秒钟。但是字母 A 不需要任何时间。
  • 只需将最后一行替换为 loop(); 这样 A 就会立即弹出
  • @SwadipSinghoRoySoumya 哦,我以为你也想将 A 延迟三秒钟,所以我也将它添加到 setTimeout() 中。 (见编辑)将其还原。所以 A 立即出现,并且每个其他字母每个 3 秒。
  • @MarkusZeller 是的,B 到 Z 可能需要 3 秒,但 A 不能花这个时间来执行。
  • @SwadipSinghoRoySoumya 是的,这就是我更新答案的原因。现在它应该按预期运行。
【解决方案3】:

从您的数组列表中替换了“A”并添加了窗口加载功能,希望对您有所帮助。

var alphAbet = ['B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']

    window.addEventListener("load",function(){
        console.log("A");
    })
    setTimeout(function loop() {
        console.log(alphAbet.shift());
    
        if (alphAbet.length){
            setTimeout(loop, 3000);
        }
    }, 3000);

【讨论】:

  • 你们俩都有正确的答案,但是就像 markus 有一个“更好”的答案,你先回答了
  • 仅在触发加载事件时。不能在节点中工作或直接粘贴在浏览器控制台中。也许这就是他为测试所做的。
猜你喜欢
  • 1970-01-01
  • 2019-05-25
  • 2013-05-08
  • 2020-09-19
  • 1970-01-01
  • 1970-01-01
  • 2014-11-05
  • 2012-07-25
  • 1970-01-01
相关资源
最近更新 更多