【发布时间】:2011-11-03 08:02:57
【问题描述】:
谁能解释一下究竟什么是Eteration并举个例子?
来源:Long running tasksDouglas Crockford 的 YUI 博客
【问题讨论】:
-
我已经用更多相关信息编辑了我的答案,准确解释了 eteration 是什么以及它在 Javascript 上下文中的使用方式。
-
我添加了一个代码示例,并附有相关说明。
谁能解释一下究竟什么是Eteration并举个例子?
来源:Long running tasksDouglas Crockford 的 YUI 博客
【问题讨论】:
最初,我认为这只是 iteration 的拼写错误,因为在网上搜索 eteration 并没有什么显着的结果。
但是,然后,我遇到了references,他说这个词是由 Crockford 本人在他的一次演讲中创造的。
在网上,我唯一能找到解释的地方是他的页面,The Factorial Tutorial,在一篇文章中,在 Act 2 中,作为对代码示例的评论,他说:
Act 2a:消息迭代(eteration)
这似乎是一对相关术语的一部分,因为他的下一个代码示例在不使用堆栈的情况下执行递归,包含该对的另一个成员:
Act 2b:消息递归(ecursion)
因此,eteration 和 ecursion 似乎是 Crockford 自己发明和定义的术语,用于指代 E Programming Language 上下文中的消息迭代和递归,设计在 Java 之上为编写分布式应用程序的开发人员提供服务。
语言被称为 E 的事实可能是为其特定迭代和递归风格赋予所选术语(**e***teration* 和 **e***cursion *)。
如果是 Javascript 的上下文,Crockford 解释了术语 eteration 作为谈话的一部分 Crockford on JavaScript -- Scene 6: Loopage,从分钟 30:40 开始:
迭代意味着将一项任务分成多个轮次,以便在每个轮次 迭代,而不是通过传统的循环,在底部 在我们调用
setTimeOut的循环中,传递给它一个导致 我们要做下一个迭代。这意味着转弯将是 短——转牌只需要一个迭代——我们可以这样做 根据需要进行多次迭代,而不是锁定事件循环。
结果是,如果时间太长,迭代会安排循环的每个步骤,而不是紧密循环,如果它需要太长时间,则阻塞接口,在一个仅阻塞接口的链中,而实际步骤执行,而不是步骤之间。这使得可以在与接口相同的线程中执行长时间运行的任务(Javascript 是单线程的),同时保持应用程序的响应能力。
以更好的质量查看完整的演讲,并附有全文成绩单here。
此外,有关如何实施这种技术的参考,请考虑以下场景:
<html>
<head>
<script type="text/javascript">
function testFeedback()
{
var feedbackDiv = document.getElementById("feedbackDiv");
feedbackDiv.innerHTML += "The Interface is Still Responsive!</br>";
}
var currentNumber = 0;
var loopStepDelay = 30;
function performLoopStep()
{
var numbersDiv = document.getElementById("numbersDiv");
numbersDiv.innerHTML = currentNumber++;
setTimeout("performLoopStep()", loopStepDelay);
}
setTimeout("performLoopStep()", loopStepDelay);
</script>
</head>
<body>
<div id="numbersDiv"></div>
</br>
</br>
<div id="feedbackDiv"></div>
</br>
</br>
<button onClick="testFeedback()">Try Me</button>
<body>
</html>
有两个 divs,一个显示正在进行的迭代的索引,另一个在每个 Try Me 按钮上附加文本 The Interface is Still Responsive!按。正如您从代码中看到的那样,迭代步骤由setTimeout 安排一段时间间隔,允许用户交互发生并被处理。因此,当用户单击按钮并触发第二个 div 的更新时,迭代步骤将继续运行,从而保持页面的响应能力,同时完成它必须执行的工作的实际进展(在这种情况下,只是显示索引)。
【讨论】: