【发布时间】:2011-06-07 15:47:51
【问题描述】:
概览
我正在处理一个项目,但我遇到了一些问题,因为事情没有按照我希望的顺序发生。所以我一直在考虑设计某种队列,我可以用它来组织函数调用和其他在启动期间使用的杂项 JavaScript/jQuery 指令,即在页面加载时。我要找的不一定是 Queue 数据结构,而是某种系统,可以确保事情按照我指定的顺序执行,并且只有在前一个任务完成后才能开始新任务。
我已经简要地查看了jQuery Queue 和AjaxQueue,但我真的不知道它们是如何工作的,所以我不确定这是否是我想要采取的方法......但我会继续阅读有关这些工具的更多信息。
具体说明
目前,我已经进行了一些设置,以便在$(document).ready(function() {...}); 内部进行一些工作,而在$(window).load(function() {...}); 内部进行其他工作。例如,
<head>
<script type="text/javascript">
// I want this to happen 1st
$().LoadJavaScript();
// ... do some basic configuration for the stuff that needs to happen later...
// I want this to happen 2nd
$(document).ready(function() {
// ... do some work that depends on the previous work do have been completed
var script = document.createElement("script");
// ... do some more work...
});
// I want this to happen 3rd
$(window).load(function() {
// ... do some work that depends on the previous work do have been completed
$().InitializeSymbols();
$().InitializeBlock();
// ... other work ... etc...
});
</script>
</head>
...这真的很乏味和丑陋,更不用说糟糕的设计了。因此,我不想处理这种混乱,而是想设计一个非常通用的系统,以便我可以,例如,排队 $().LoadJavaScript();,然后是 var script = document.createElement("script");,然后是 $().InitializeSymbols();,然后是 $().InitializeBlock();,等等......然后Queue 将执行函数调用和指令,这样在一条指令执行完成后,另一条指令可以启动,直到 Queue 为空,而不是我重复调用 dequeue。
这背后的原因是,由于依赖于已完成的配置和初始化步骤,因此需要先进行一些工作,例如配置和初始化,然后才能开始其他工作。如果这听起来不是一个好的解决方案,请告诉我:)
一些基本工作
我已经为基本队列which can be found here 编写了一些代码,但我希望扩展它的功能以便我可以存储各种类型的“对象”,例如单独的 JavaScript/jQuery 指令和函数调用,基本上是我想要执行的代码片段。
更新
使用我已经实现的当前队列,看起来我可以存储函数并在以后执行它们,例如:
// a JS file...
$.fn.LoadJavaScript = function() {
$.getScript("js/Symbols/Symbol.js");
$.getScript("js/Structures/Structure.js");
};
// another JS file...
function init() { // symbols and structures };
// index.html
var theQueue = new Queue();
theQueue.enqueue($().LoadJavaScript);
theQueue.enqueue(init);
var LJS = theQueue.dequeue();
var INIT = theQueue.dequeue();
LJS();
INIT();
我还认为我已经弄清楚了如何存储单个指令,例如 $('#equation').html(""); 或者甚至 if-else 语句或循环,将它们包装成这样:
theQueue.enqueue(function() { $('#equation').html(""); // other instructions, etc... });
但这种方法需要我等到队列完成其工作后才能继续工作。这似乎是一个不正确的设计。有没有更聪明的方法呢?另外,我怎么知道某个函数已经执行完毕,这样队列才能知道继续前进?是否有某种可以等待的返回值或可以为队列中的每个任务指定的回调函数?
整理
由于我在客户端做所有事情并且我不能让队列独立做自己的事情(根据下面的答案),有没有比我等待队列完成工作更聪明的解决方案?
由于这更像是一个设计问题而不是特定的代码问题,我正在寻找解决我的问题的方法的建议,关于我应该如何设计这个系统的建议,但我绝对欢迎,并希望看到,支持建议的代码 :) 我也欢迎对我在上面链接到的 Queue.js 文件和/或我对我的问题的描述以及我计划采取的解决方法的任何批评。
谢谢,赫里斯托
【问题讨论】:
-
如需了解队列,请查看Can somebody explain jQuery queue to me?。那里有一些使用自定义队列的好例子。
-
是的,我实际上一直在阅读它以及另一篇文章,但我不确定它是否是我要找的。span>
-
就个人而言,我认为当您开始提出“如何重新组织 javascript 的运行方式(以及顺序)”问题时,是时候重新考虑您的逻辑了。有些事情告诉我你需要退后一步,重新考虑你的过程和方法,并得出一个更好的结论。总有另一种方法可以完成您需要实现的目标(尽管您很具体,但这个问题仍然太模糊,无法在不直接解决手头的“制作队列系统”任务的情况下给您一个结论性的答案)。
-
我认为你是对的,这就是我发布这个问题的原因......作为重新思考逻辑的第一步。我发现我走错了路,我正试图在为时已晚之前纠正它。话虽如此,我并不是在寻找你给我这个系统,而是帮助我提出我不熟悉的设计理念,你可能会对我所描述的问题有益。我正在与这个社区联系,以集思广益一个好的方法,就像你说的那样,得出一个更好的结论。
标签: javascript jquery queue client-side