阿罗哈。这是我潜伏多年后的第一个问题。对于这个问题的冗长但直接的形式,以及可接受答案的限制,我深表歉意,但我是来贡献的。我有一个问题,其他问题(例如如何避免 Node.js 中异步函数的长嵌套或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() 和 fade() 函数非常相似,它们看起来非常相似:
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() 循环或等效循环中调用它——将这些操作按顺序应用于每个操作。如果你已经读到这里,我要感谢你的时间和考虑。:)