阿罗哈。这是我潜伏后的第一个问题。我对这个问题的详细而直接的形式以及对可接受答案的限制表示歉意 - 但我在这里作出贡献。我有一个问题,其他问题(例如How to avoid long nesting of asynchronous functions in Node.js或Chained callback readability in Javascript?)不能满足我的要求。带有setTimeout()的Javascript回调地狱;
我想要执行多个Javascript回调,以便我有一个接一个发生的四个动作序列。这里是源:
var self = this;
fade(div, fadeIn, -20, function() {
load(unload, dataOut, -10, function() {
load(self, dataIn, 10, function() {
fade(div, fadeOut, 20),0);
unload = self;}
);}
);}
);
的load()和淡入淡出()函数,除了内部语义细节十分相似,而且他们看起来非常类似于这样:
function load(menuCategory, data, step, callback) {
menuCategory.parentNode.style.width = data+"px";
data += step;
if(dataIn <= data && data <= dataOut) {
setTimeout(function() { load(menuCategory,data,step,callback) }, 15);
} else if(callback && (typeof(callback) == 'function')) {
callback();}
}
我有几个问题与这个混乱相关,但首先让我给你我没有找到的答案。使用jQuery的答案是不可接受的。使用其他计时或“同步”框架或模块的答案是不可接受的。质疑阻止执行的原因的答案是不可接受的。使用JavaScript以外的语言的答案是不可接受的。非抽象的答案是可以接受的,但最终的解决方案将需要尽可能抽象,这意味着答案必须能够采取各种类似但略有不同的行动。
这里是我的主要问题: 是否有一个函数/对象,我可以用它来顺序应用这些动作,以减少在这里回调地狱?换句话说,如果对象/函数能够同步执行每个动作(因为它是通过它单独迭代的)(即传递给它),对象将会是什么样子?
次要问题: 是任何人都清楚这一点回调业务多少看起来像在其他语言中的goto()?意思是,这种回调嵌套感觉对我来说非常尴尬和不雅。是否有正在开发或已经开发的Javascript语言结构可以减少这种疯狂的业务?回调嵌套是一些最难遵循的逻辑流程。它只是感觉尴尬。
我的目标是一个严密的,优雅的,有吸引力的,土生土长的Javascript对象/功能 - 我可以在一个for()循环或等效通话 - 在序列中的每个动作应用这些操作。如果你已经读了这么多,我想感谢你的时间和考虑。 :)
我想这个问题“*为什么你使用'setTimeout(func(),0)'?*”是非常合法的,因为你的'fade'和'load'函数都不会返回可能超时的函数与['setTimeout'](https://developer.mozilla。组织/ EN-US /文档/ DOM/window.setTimeout)。这是你的问题的缺陷,或者它是你的代码混乱的实际原因? – Bergi
http://javascript.info/tutorial/events-and-timing-depth – L0j1k
你可以尝试制作一个假堆栈作为对象'fakeStack = []'的数组,其中'fade'或'load'的参数为对象中的键/值对,'fakeStack.push({cat:div,data:fadeIn,step:-20})'然后使用'fakeStack [0]',当你遇到循环结束时,再次调用'fakeStack.shift()'。 –