【发布时间】:2012-07-01 22:38:20
【问题描述】:
我的具体问题是我需要执行(可能)大量的 Javascript 函数来准备批处理文件之类的东西(每个函数调用都会将一些信息添加到同一个批处理文件中),然后在所有这些调用完成之后,执行最终函数以发送批处理文件(例如,将其作为 HTML 响应发送)。我正在为此寻找通用的 Javascript 编程模式。
泛化问题: 给定 Javascript 函数 funcA()、funcB() 和 funcC(),我想找出排序执行的最佳方法,以便 funcC 仅在 funcA 和 funcB 执行后执行。我知道我可以使用这样的嵌套回调函数:
funcA = function() {
//Does funcA stuff
funcB();
}
funcB = function() {
//Does funcB stuff
funcC();
}
funcA();
我什至可以通过传入回调参数使这个模式更通用一些,但是,这个解决方案变得非常冗长。
我也熟悉 Javascript 函数链,解决方案可能如下所示:
myObj = {}
myObj.answer = ""
myObj.funcA = function() {
//Do some work on this.answer
return this;
}
myObj.funcB = function() {
//Do some more work on this.answer
return this;
}
myObj.funcC = function() {
//Use the value of this.answer now that funcA and funcB have made their modifications
return this;
}
myObj.funcA().funcB().funcC();
虽然这个解决方案对我来说似乎更简洁一些,但随着计算步骤的增加,函数执行链会变得越来越长。
对于我的具体问题,funcA、funcB 等的执行顺序并不重要。因此,在我上面的解决方案中,我在技术上做的工作比需要的要多,因为我将所有功能都按顺序排列。对我来说重要的是 funcC (一些用于发送结果或触发请求的函数)仅在 funcA 和 funcB 完成执行后才被调用。理想情况下,funcC 可以以某种方式侦听所有要完成的中间函数调用,然后执行?我希望学习一个通用的 Javascript 模式来解决这样的问题。
感谢您的帮助。
另一个想法: 也许将共享对象传递给 funcA 和 funcB 并在它们完成执行时标记共享对象,例如 sharedThing.funcA = "complete" 或 sharedThing.funcB = "complete" 然后以某种方式?当共享对象达到所有字段都标记为完成的状态时,执行 funcC。我不确定你如何让 funcC 等待这个。
编辑: 我应该注意我正在使用服务器端 Javascript (Node.js),我想学习一种模式来解决它,只需使用普通的旧 Javascript(不使用 jQuery 或其他库)。当然,这个问题足够普遍,以至于有一个干净的纯 JavaScript 解决方案?
【问题讨论】:
-
按照您希望执行它们的顺序构建对函数的引用数组,然后将该数组传递给另一个函数,该函数仅遍历数组调用函数。确保你想成为最后一个。
-
或者只是按照你想要的执行顺序编写代码;我不清楚问题到底是什么。顺序命令式编码总是让你承诺程序语句的执行顺序;这种情况有什么特别之处?
-
这很聪明尖利,我从来没想过要那样做。如果您的功能启动有延迟怎么办?还要等完成吗?
-
这可能有点矫枉过正,但 jQuery 有一个延迟特性。基本上,它允许您使用类似
$.when(A, B).then(C)的语法。 -
正如Pointy所说,这里真正的问题是什么?这些函数中的任何一个是异步的吗?如果没有,那么 javascript 只是按照你编写的顺序执行它们。
标签: javascript node.js design-patterns asynchronous