JavaScript变量";失焦“;?

JavaScript变量";失焦“;?,javascript,Javascript,我有一个函数(见下文)可以将消息写到屏幕上。无论何时,当您积极地查看它正在运行的页面时,它都会很好地打印出来;但是,假设您正在另一个选项卡中观看视频,并切换回编写函数的选项卡,则文本会变得非常混乱。e、 g:“这是一条信息。”通常会像“t isa hismg esseg”一样被打乱 有关职能: 参数: 消息:string 对象:一个HTML对象 function writeMessage(message,object){ var i = 0; var interval = set

我有一个函数(见下文)可以将消息写到屏幕上。无论何时,当您积极地查看它正在运行的页面时,它都会很好地打印出来;但是,假设您正在另一个选项卡中观看视频,并切换回编写函数的选项卡,则文本会变得非常混乱。e、 g:“这是一条信息。”通常会像“t isa hismg esseg”一样被打乱

有关职能:

参数:

消息:string

对象:一个HTML对象

function writeMessage(message,object){
    var i = 0;
    var interval = setInterval(function(){
        if(i < message.length){
            object.append(message.substr(i,1));
            i++;
        }else{
            clearInterval(interval);
        }
    }, 25);
}
函数writeMessage(消息、对象){
var i=0;
var interval=setInterval(函数(){
if(i

知道为什么会发生这种情况吗?

我还没有测试过,但是如果评论说的是真的,您应该能够通过手动链接单个延迟操作来避免这种情况。您应该能够调用一个超时(
setTimeout
函数),而不是定义一个间隔,该函数将字母附加到对象,然后递归调用自身,同时将其余消息传递给递归调用

在这种情况下,如果设备没有给异步操作处理器时间,那么至少后续操作不会被创建和执行——因为只有第一个(正在等待的)操作中的代码可以这样做


或者,您可以使用生成一个可观察的时间间隔,在此时间间隔上,您可以使用消息订阅和更新对象。如果你不熟悉反应式编程,这对你来说可能是一个巨大的新话题,但我当然可以推荐它——如果只是一个脑筋急转弯,看看不同的编程方法

真奇怪。作为旁白,回归真实;除了停止clearInterval()的执行之外,它什么也不做(setInterval()不关心传递给它的函数返回什么)。这听起来像是移动设备为了省电而做的事情。我想我的iPhone不会执行间隔事件,除非你在页面上。@WaleedKhan,嗯,我不确定是不是这样,因为它肯定在我的桌面上。我可以确认所有间隔/设置超时都在运行,只是当我在执行后切换到页面时,写入的消息是乱七八糟的。当您切换页面时,运行该页面的进程(至少在Chrome中)失去优先级。当您切换回页面时,它将尝试并赶上—我猜在这一点上,它有一系列setInterval function()执行,它将以某种任意顺序执行,因此,当我按顺序递增时,这些函数不会按相同的顺序进行计算。这就解释了为什么信息会被传递出来,只是杂乱无章。@MikeP这听起来像是一个合乎逻辑的解释。知道如何防止这种情况发生或实施“修补程序”吗?这不是一个大问题,只是一个大麻烦。+1长期以来,人们建议避免使用
setInterval
,而是使用recursive
setTimeout
。这样你可以避免很多比赛条件,我相信你也可以避免你所发布的问题。