javascript - Node.js:异步代码 + js 闭包的问题

标签 javascript node.js asynchronous closures

我很难适应 Node 的单线程 + 异步特性,再加上 javascript 的函数闭包。

假设我有这样的东西:

function foo(bar) {
    someAsyncFunction(function callback(err) {
        // do stuff with 'bar'
    });
}

如果我遗漏了什么,请告诉我;但我的理解是:

  • 由于闭包,callback 将有一个 referencebar
  • 但是,如果 foo 被调用一次且 bar = 20,则再次调用 bar = 42 before callback 从第一次调用开始调用,然后 barcallback 中会是 42 由第一次调用 foo 产生。在 换句话说:

    1. foo(20) #1
    2. someAsyncFunction(function callback() {}) #1
    3. foo(42) #2
    4. someAsyncFunction(function callback() {}) #2
    5. callback() #1 --------> 使用 bar=42
    6. callback() #2 --------> 使用 bar=42

我说的对吗? (bar 是原始类型还是对象有关系吗?)。如果是这样,我该怎么做才能确保 callback 使用 bar 的正确值(除了传递 bar 一直向下和向上调用堆栈)?感谢您的帮助。

最佳答案

这是不正确的。每次调用 foo 都会创建一个新的 bar,因此每个回调函数都可以访问不同的 bar

如果您希望只有一个 bar,请在 foo 之外声明它,以便 foo 的每次调用共享相同的 条形图:

var bar;
function foo(arg) {
    bar = arg;
    someAsyncFunction(function callback(err) {
        // do stuff with 'bar'
    });
}

这里,foo 没有声明一个新的 bar 变量,而是设置在更高范围内声明的 bar 的值。

关于javascript - Node.js:异步代码 + js 闭包的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19985052/

相关文章:

javascript - 使用 Node.js 文件系统定期将 json 数据写入文件并换行读取

javascript - Discord.js RichEmbed 字段值 "empty"甚至认为它们不是。消息更新

java - Java Web 应用程序中的异步电子邮件处理

c# - 将 Task<A> 异步转换为 Task<B>

python - 使用os.system异步,独立于python进程?

javascript - 列渲染,监听<i>标签的点击事件

javascript - 按值对对象排序

javascript - 这些 javascript DNA 补体算法是否等效且最优?

javascript - 使用数组条件更新 mysql 数据库

javascript - Redux 使用 combineReducers 返回空白页