如何在JavaScript中更改条件下的间隔时间?

如何在JavaScript中更改条件下的间隔时间?,javascript,setinterval,Javascript,Setinterval,我需要一个功能,将打印字母一个接一个,但在“,”后暂停。 我试着这样做,但没有成功: var span = document.getElementById('text') function print(string){ var i = 0 var time = 50 var timer = setInterval(function(){ span.innerHTML += string[i++] if(string[i] == ","){ time = 1

我需要一个功能,将打印字母一个接一个,但在“,”后暂停。 我试着这样做,但没有成功:

var span = document.getElementById('text')
function print(string){
  var i = 0
  var time = 50
  var timer = setInterval(function(){
    span.innerHTML += string[i++]
    if(string[i] == ","){
      time = 150
    }else{
      time = 50
    }  
  },time)
}

首先,我不认为你要找的是
setInterval
。由于您似乎只想延迟打印每个字符,
setTimeout
在这种情况下效果最好

我将对此进行分解,以便您可以一次只打印一个字符,然后您可以在主
print
函数中为字符串中的每个字符调用该函数

我就是这样做的,用承诺:

const printCharacter = (ch, idx) => new Promise(resolve => {
    let time = 50 * idx;

    if(ch === ',') {
        time = 150 + time * idx;
    }

    setTimeout(() => {
        const span = document.getElementById('text');
        span.innerHTML += ch;
        resolve();
    }, time)
});

const print = async string => {
    for(let i = 0; i < string.length; i++) {
        await printCharacter(string[i], i);
    }
};
constprintcharacter=(ch,idx)=>newpromise(resolve=>{
设时间=50*idx;
如果(ch==','){
时间=150+时间*idx;
}
设置超时(()=>{
const span=document.getElementById('text');
span.innerHTML+=ch;
解决();
},时间)
});
常量打印=异步字符串=>{
for(设i=0;i

这里可能会出现一些错误,例如基本字符串中出现多个逗号的时间。这只是我的第一次迭代。

我建议使用for循环来迭代字符串,并承诺根据需要暂停多长时间

旁注,请使用
textContent
而不是
innerHTML
。前者类似于
myCar.cangeTires();myCar.closeDoors()
,后者类似于myCar.do(“更换轮胎”);myCar.do(“关门”)

let sleep=ms=>新承诺(resolve=>setTimeout(resolve,ms));
var span=document.getElementById('text');
让打印=异步字符串=>{
span.textContent='';
for(让c为字符串){
span.textContent+=c;
等待睡眠(c==','-500:50);
}
};
打印(“我的文本和逗号”)

一旦定义,我不确定您是否可以更改
设置时间间隔的时间。最好使用
setTimeout
。我使用递归函数来实现所需的-

function print(string, i){
  var time = 50
  if(string[i]==",") time = 1000
  setTimeout(function(){
    span.innerHTML += string[i]
    if(i<string.length-1) print(string,++i)
  },time)

}
函数打印(字符串,i){
var时间=50
如果(字符串[i]==“,”)时间=1000
setTimeout(函数(){
span.innerHTML+=字符串[i]

如果(我不会回答一个关于vanilla JS的问题,因为JS代码只在一些浏览器/Node.JS中运行。使用异步似乎有点过分了……比如,当你可以使用
setInterval
时,你为什么要等待
setInterval
?一个
承诺
做什么来帮助解决这个问题?看起来非常复杂ed.如果OP明确表示希望使用异步方法,这可能是一个很好的答案。
Async
自chrome 55以来就得到了支持。我不会说避免不必要的回调是“过度杀伤力”,我会说这是对任何人的期望(有能力)是的,但IE仍然在野外广泛使用,因为很多公司在某个时候跳上了SilverLight列车,或者他们拥有微软的堆栈(在出现安全漏洞之前,微软一直在使用浏览器技术),承诺在IE中是不受支持的,没有polyfill。这绝对是矫枉过正的,如果在每一个问题上都抛出承诺,不管问题的复杂性如何,这将使您的代码很难遵循,没有明显的原因。这有点像使用
localStorage
IndexedDB
来存储普通数组,仅仅因为你可以。这既不必要,也不实用,而且会使你的代码难以理解。(阅读代码的很大一部分是在推理为什么事情是这样的……当你不能在更高的层次上推理时,就很难理解在较低层次上发生的事情是否正确)这是一个很好的答案。你不需要使用外部站点发布JS/HTML/CSS代码片段,以供将来参考。有一个内置的小部件。