基本上我希望能够在$ .holdTillFinished()方法中包装任何命令,该方法不允许执行继续,直到指定的方法/ jquery动画执行完毕。
我怀疑这在javascript中可能很难甚至不可能,但我希望有人知道。
我不想听到如何将回调传递给动画以使其运行完整,或其他类似的东西。
我真的想知道这样的事情是否可行,以及如何解决这个问题。
如果有人知道一个能够排队用户定义的方法和动画的好队列插件,那么这种情况就不会发生,那也很酷。我真正想要的是一种延迟执行的方法。(虽然仍然允许动画功能)
答案 0 :(得分:10)
我怀疑这在javascript中可能很难甚至不可能
你的怀疑是正确的。像动画,用户输入循环和'async = true'这样的方法XMLHttpRequests 必须将控制权返回给浏览器才能继续,并且浏览器无法恢复控制,直到函数调用的每个嵌套级别都返回。这意味着你的所有代码,包括调用'holdTillFinished()'的函数都必须放松:因此'holdTillFinished()'是不可能的。
其他语言具有流控制功能,允许您有效地执行异步进程,使其成为调用方看起来同步的异步进程,反之亦然。最着名的是threads和continuations。 JavaScript没有这些功能,所以你能做的最好就是超时和回调。
(将回调定义为内联函数以获取对闭包函数在闭包中的变量的访问权限至少会带来一些痛苦;其他一些语言必须开始在对象的属性中包装封闭状态的每一位实现这一点。)
答案 1 :(得分:3)
您可能正在寻找http://docs.jquery.com/Effects/queue
但如果你正在寻找一种更普遍的延迟方式,我之前就已经使用过这个片段(我没有写过,所以归功于原作者):
//Simple wrapper enabling setTimout within chained functions.
$.fn.wait = function(time, type) {
time = time || 1000;
type = type || "fx";
return this.queue(type, function() {
var self = this;
setTimeout(function() {
$(self).dequeue();
}, time);
});
};
答案 2 :(得分:0)
您可以使用发布/订阅架构来实现您的目标。我不知道你想要达到什么目标,我猜这对你有用。
这种方法的工作方式是将函数的完成视为一个事件,您可以监听并附加处理程序。 Dojo has a pubsub mechanism,虽然我确定还有其他人。
答案 3 :(得分:0)
它可以防范情况,但通常需要显示在调用AJAX或在javascript中执行任何循环时要显示的处理图像。我有一种情况,我在循环中调用AJAX,以便用户显示处理图像。终止我做了一个技巧。当调用此函数时,我放置了一个按钮来取消作业我设置了一个全局变量,将'cancelJob'设置为true,并在循环中我检查此全局,如果这是真的,则运行返回false并且脚本将停止。 / p>
var cancelJob = false;
foreach(){
if(cancelJob == true)
return false;
}
function cancelButtonPress(){
cancelJob = true;
}