Node.js:asynchronous代码+ jsclosures的麻烦
我无法适应Node的单线程+asynchronous性,再加上javascript的函数闭包。
假设我有这样的东西:
function foo(bar) { someAsyncFunction(function callback(err) { // do stuff with 'bar' }); }
请让我知道,如果我失去了一些东西; 但我的理解是:
- 由于closures,
callback
会有一个参考bar
-
但是,如果在
bar
= 20时调用foo
一次,那么在第一次调用callback
之前再次使用bar = 42
,那么bar
在第一次调用foo
callback
中将是42。 换一种说法:-
foo(20)
#1 -
someAsyncFunction(function callback() {})
#1 -
foo(42)
#2 -
someAsyncFunction(function callback() {})
#2 -
callback()
#1 ——->使用bar
= 42 -
callback()
#2 ——->使用bar
= 42
-
我纠正这个吗? (如果bar
是原始对象还是对象,这是否重要?)。 如果是这样,我可以做些什么来确保callback
使用正确的值的bar
(ASIDE从传递bar
一直向下和调用堆栈)? 感谢您的任何帮助。
这是不正确的。 每个foo
调用都会创build一个新的bar
,所以每个callback函数都可以访问不同的bar
。
如果你想要只有一个bar
,在foo
之外声明它,这样每个foo
调用共享一个bar
:
var bar; function foo(arg) { bar = arg; someAsyncFunction(function callback(err) { // do stuff with 'bar' }); }
在这里, foo
不会声明一个新的bar
variables,而是将bar
的值设置在一个更高的范围内。
不, bar
执行第一次asynchronouscallback时仍然是20。 每次调用foo
都会获得自己的bar
,这个bar
不会被未来的foo
调用所影响。