Javascript nodejs异步函数参数在快速调用中的持久性

Javascript nodejs异步函数参数在快速调用中的持久性,javascript,node.js,zeromq,Javascript,Node.js,Zeromq,抱歉,这个话题可能会让人困惑,因为我不知道该怎么说 考虑一种情况,我有一个带一个参数的异步函数。数组 我在函数中使用了这个参数。我担心多次调用函数可能会重写以前发送给函数的数组。这会发生吗 假设此代码: //这是一个IPC函数,将由另一个进程调用 responder.on('message', function(request) { resp = msgpack.unpack(request); //resp is my array. myvar = resp[1];

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

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

我在函数中使用了这个参数。我担心多次调用函数可能会重写以前发送给函数的数组。这会发生吗

假设此代码: //这是一个IPC函数,将由另一个进程调用

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

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

考虑以下示例:

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副本并将其存储到“temp”中,该“temp”仅在该函数的范围内修改,并且闭包中定义的temp保持不变。因此,您的问题的答案是,这取决于您已声明响应变量的范围级别。从你写作的方式来看,我认为你所关注的事实上是一个问题

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

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

与responder.on函数的作用域相比,您能否扩展“resp”变量的声明位置。这对于回答这个问题非常重要。现在看来,您已经创建了一个全局函数,并为其分配了msgpack.unpack(request)的值。如果在处理程序函数外部声明了“resp”,那么它将由在该上下文中创建的所有此类处理程序(以及所有调用)共享。但是,还应该注意的是,在任何时候只有一个对处理程序的调用是活动的。@Pointy:“在任何时候只有一个对处理程序的调用是活动的。”Node没有提供这样的保证,我认为这正是OPs所关心的。@ChrisCM啊,如果是这样的话(我发现这有点令人惊讶,因为这意味着存在大量潜在的同步问题,JavaScript没有提供任何工具),那么是的,这是一个问题。@ChrisCM实际上我发现很难找到任何声称节点事件循环可以被另一个事件抢占的内容。实际上,我只在这个函数中使用resp,而不是在某些父函数中使用resp。无论如何,我更改了代码并用“var”定义了resp。谢谢,在这种情况下,您创建了一个错误的全局(不太好)而且会不必要地造成这个问题,因此,这应该是一个无缝的解决方案!祝你好运!