我有一个函数让我们称之为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})
}
}
当然这段代码不起作用,因为我将从每个函数调用中发送两次响应
无论如何我可以在一个中进行这两个函数调用吗?
答案 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});
}
}
}