在node.js中调用两次函数

时间:2017-08-08 11:01:12

标签: javascript node.js

我有一个函数让我们称之为getX,它接受四个参数,一个是计数器,一个用户列表,一个变量x和响应。我想做类似以下的事情。

let detectX = function(i, users, x, res){
    if(i<users.length){
        //do something with x
        if(users.indexOf(x)){
            //do something
        } else{
            detectX(i, users, 0, res);
        }
        detectX(++i, users, x, res);
    }
    else{
        res.send({x})
    }
}

当然这段代码不起作用,因为我将从每个函数调用中发送两次响应

无论如何我可以在一个中进行这两个函数调用吗?

4 个答案:

答案 0 :(得分:0)

如果你想避免多次通话,你可以尝试这样的事情:

<强>指针

  • indexOf返回数值。如果找不到-1,则找到索引。使用if(users.indexOf(x))不正确,因为如果找到x作为第一个元素,如果找不到值,它将会失败。
  • 如果您希望避免多次调用同一个函数,可以创建表示参数的局部变量并根据条件处理它们,最后将它们传递给单个函数调用。

let detectX = function(i, users, x, res){
    if(i<users.length){
      // Assign default values to them to avoid `else` processing
      let n = i,
          newX = 0;
        //do something with x
        if(users.indexOf(x) >= 0){
            //do something
            n++;
            newX = x;
        } 
        detectX(n, users, newX, res);
    }
    else{
        res.send({x})
    }
}

答案 1 :(得分:0)

如果我理解正确,你的res.send会被调用两次,但那不是因为你在你的函数中多次调用detectX,而是因为你的内部if / else是错误的..如果你输入else,那么你也调用第二个detectX,所以你应该完全分开2个电话

 if(users.indexOf(x)){
    detectX(++i, users, x, res);//or whatever you have to do
 } else{
    detectX(i, users, 0, res);
 }

如果我可以指出一件事,我会重构函数,所以它返回x,然后在响应中发送x,就像这样

let detectX = function(i, users, x){
    if(i<users.length){
        //do something with x
        if(users.indexOf(x)){
            return detectX(++i, users, x);
        } else{
            return detectX(i, users, 0);
        }

   }
   else{
       return x
   }
}

let detected = detectX(i,users,x)
res.send({detected})

答案 2 :(得分:0)

let detectX = function(i, users, x, res){ 
    if(i<users.length){ 
    //do something with x        
    if(users.indexOf(x)){
     //do something 
    } else{ 
       detectX(i, users, 0, res); 
       return; // here
    } detectX(++i, users, x, res);
  } else{ 
   res.send({x})
  }
 }

我想这就是你要找的东西。在else块中自调用后添加了一个return语句。

答案 3 :(得分:0)

我设法通过定义一个全局数组来解决这个问题,并将其命名为functionsStack,并将其中的一个函数推送到其中直到我完成循环

global.functionsStack = []

let detectX = function(i, users, x, res){
    if(i<users.length){
        //do something with x
        if(users.indexOf(x)){
            //do something
        } else{
            functionsStack.push({"i":i, "users":users, x:"0"});
        }
        detectX(++i, users, x, res);
    }
    else{
        if(functionsStack.length>0){
            var currentFunction = functionsStack[0];
            functionsStack.splice(0,1);
            detectX(currentFunction.i, currentFunction.users, currentFunction.x, res);
        } else{
            res.send({x});
        }
    }
}