我知道乍一看(由于标题)这看起来像是“你在发布之前尝试搜索Google了吗?”问题,但我似乎无法找到我正在经历的具体问题的答案。对不起,如果我是一个菜鸟......还在学习:)。
我需要在javascript中模拟暂停,但是setTimeout(function_call,timeout)函数对我不起作用。原因是......当调用setTimeout函数时,它会异步调用函数。
一点背景:
我正在尝试模拟以随机定时间隔输入div的文本。我希望它看起来好像一个人在用户正在查看页面时实际上正在键入消息。由于超时是一个随机间隔,并且函数调用是异步进行的,因此文本最终会以随机顺序打印。
这是我到目前为止的一个片段:
typeString: function(s)
{
for(var i=0;i<s.length;i++)
{
var c = s.charAt(i);
var temp = setTimeout("MessageType.typeChar('" + c + "')", this.genRandomTime());
}
}
在此先感谢您的帮助。
CJAM
更新:通过将定时器延迟添加到varialbe,它使我能够为异步调用偏移timeOut。谢谢大家的快速回复。这是更新的代码:
typeString: function(s)
{
var delay = 0;
for(var i=0;i<s.length;i++)
{
var c = s.charAt(i);
setTimeout("GoogleTyper.typeChar('"+c+"')", delay += this.genRandomTime());
}
}
答案 0 :(得分:3)
您是否尝试过累计设置超时?将变量粘贴在循环外部并将其初始化为0.现在让我们将其称为超时。在循环的每次迭代开始时向该变量添加一个随机的时间量,并使超时工作失效。这样,您可以确保按顺序调用函数。
答案 1 :(得分:2)
你的问题是你正在使用一个从现在开始延迟的所有时间 - 下一个计时器需要在前一个之后被触发。只需将以前的计时器延迟添加到新计时器。
typeString: function(s)
{
var delay = 0;
for(var i=0;i<s.length;i++)
{
var c = s.charAt(i);
delay = delay + this.genRandomTime();
var temp = setTimeout("MessageType.typeChar('" + c + "')", delay );
}
}
答案 2 :(得分:1)
让每个事件处理程序从队列中取出下一个字符(数组,列出任何内容),而不是传递给要显示的字符的每个计时器事件,以便维护顺序。