【问题标题】:nodejs async function parameters durability in rapid callsnodejs异步函数参数快速调用中的持久性
【发布时间】:2013-07-22 22:18:03
【问题描述】:

抱歉,这个话题可能会让人困惑,因为我不知道该怎么说。

考虑一种情况,我有一个带有一个参数的异步函数。一个数组。

我在函数内部使用了这个参数。恐怕多次调用函数可能会重写我之前发送给函数的数组。会不会发生?

假设以下代码: //这是一个IPC函数,将被另一个进程调用。

responder.on('message', function(request) {
    resp = msgpack.unpack(request);
    //resp is my array.
    myvar = resp[1];
    .
    .
    .
}

恐怕 resp[] 会在第一次调用完成之前被覆盖,这会导致第一次调用代码执行出现问题。

【问题讨论】:

  • 与您的 responder.on 函数的范围相比,您能否扩展声明“resp”变量的位置。这对于回答这个问题非常重要。现在看来您已经创建了一个全局变量,并为其分配了 msgpack.unpack(request) 的值。
  • 如果 "resp" 在处理函数之外声明,那么它将被在该上下文中创建的所有此类处理程序(以及所有调用)共享。但是,还应该注意的是,任何时候只有一次处理程序调用处于活动状态。
  • @Pointy:“任何时候只有一个处理程序调用处于活动状态。” Node 没有提供这样的保证,而这正是我认为 OP 关心的问题。
  • @ChrisCM 好吧,如果是这样的话(我觉得这有点令人惊讶,因为这意味着 JavaScript 没有提供许多潜在的同步问题),那么是的,这是一个问题。
  • @ChrisCM 实际上我发现很难找到任何声称节点事件循环可以被另一个事件抢占的东西。

标签: javascript node.js zeromq


【解决方案1】:

考虑以下示例:

function doStuff() {
    var temp = 0;

    function modifyTemp(temp) {
        temp = 5;
    }

    modifyTemp(temp);

    //the value of temp is still 0

    function modifyTemp2() {
        temp = 10;
    }

    modifyTemp2();

    //temp now equals 10
}

doStuff();

请注意 temp 在“doStuff()”的闭包范围内。因此,在此范围内对 temp 的任何引用都将使用此引用,除非有一个优先,如 modifyTemp(temp) 声明的示例。在这种情况下,创建临时变量的临时副本并将其存储到“temp”,仅在此函数的范围内对其进行修改,并且在闭包中定义的 temp 保持不变。所以你的问题的答案是,这取决于你声明你的 resp 变量的范围级别。你的可能看起来写的方式,我建议你担心发生的事情实际上是一个问题。

以下修改(在已注释/未注释的行中提供)可能会提供完全不同的行为,具体取决于您程序的其余部分如何运行,以及您正在进行多少异步操作。请注意,未注释的实现重新定义了变量,因此我们不必担心连续运行或其他函数会干扰它的值。

responder.on('message', function(request) {
    //resp = msgpack.unpack(request);
    var resp = msgpack.unpack(request);
    //resp is my array.
    myvar = resp[1];
    .
    .
    .
}

【讨论】:

  • 实际上,我只在这个函数内部使用了resp,而不是在某些父函数中。无论如何,我改变了我的代码并用“var”定义了resp。谢谢
  • 啊,在这种情况下,您创建了一个错误的全局(不好)并且会不必要地创建此问题,因此这应该是您的无缝修复!祝你好运!
猜你喜欢
  • 1970-01-01
  • 2018-09-05
  • 1970-01-01
  • 2017-06-27
  • 2019-01-07
  • 1970-01-01
  • 2018-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多