【发布时间】:2015-03-15 13:17:49
【问题描述】:
我对 JavaScript 相当陌生,我在 node 中工作,这需要对异步编程和回调设计有很好的理解。我发现即使你的回调有多个层次,使用嵌入式函数也很容易。您的嵌入式回调最终只是闭包。
但是,当您有多个回调层时,其中许多回调在执行路由中是相似的,您最终会在单独的回调链中一遍又一遍地重写大量回调代码。例如,如果将下面的 mycb1 和 mycb2 定义移到 A 之外,则它们不再具有对 A 变量的隐式访问,因此不再用作闭包。
嵌入定义的示例,其中它们用作闭包。
mod.A=function(){
var mycb1=function(err){
if (!err){
var mycb2=function(err){
cb(err);
};
mod.foo2(args,mycb2);
}
else{cb(err);}
};
mod.foo1(args,mycb1);
}
mod.foo1 = function(args,cb){
//do some work
cb(err);
};
mod.foo2 = function(args,cb){
//do some work
cb(err);
}
//execute
mod.A();
我想执行以下操作,但能够更改 mycb1 和 mycb2 函数的变量范围,以便它们可以用作调用它们的任何位置的闭包。 例如:
var mycb2=function(err){
...
cb(err);
};
var mycb1=function(err){
if (!err){
mod.foo2(args,mycb2); //but have it act like a closure to mycb1
}
else{cb(err);}
};
mod.A=function(){
...
mod.foo1(args,mycb1); //but have it act like a closure to A
}
mod.foo1 = function(args,cb){
//do some work
cb(err);
}
mod.foo2 = function(args,cb){
//do some work
cb(err);
}
我知道我可以实现一个设计,在模组级别设置变量,以便模组级别的函数可以访问它们。然而,这似乎在某种程度上污染了 mod 范围,其中的变量可能只能由它的一些方法使用。我也知道我可以传入变量以使它们在执行时可供回调访问。但是,如果我了解 JS 和回调是如何工作的,我将不得不将它们传递给 fooX,然后让 foo 将它们传递给回调。这似乎也不是一个好的计划。 是否可以更改函数的变量范围,使其从执行点而不是定义点像闭包一样起作用?如果没有,将回调代码模块化以便重复使用的最佳方法是什么?
【问题讨论】:
-
您可以使用 Function.bind() 在运行时将已知值合并到命名回调中。如果我理解正确的话,这几乎是“从执行点关闭”。
-
你也可以使用 Promises 来保持状态,而不会过度拥挤模块闭包
-
很好的建议。谢谢。
标签: javascript node.js callback reusability asynccallback