Javascript node.js中异步函数的递归调用
我编写了一个递归查询,以数据库级或分层方式更新数据 我编写了以下代码:Javascript node.js中异步函数的递归调用,javascript,node.js,recursion,mongoose,Javascript,Node.js,Recursion,Mongoose,我编写了一个递归查询,以数据库级或分层方式更新数据 我编写了以下代码: let updateInvitationRewards=函数(父级、级别、回调){ Service.customer.getOneCustomer({ _id:家长 },{},{},函数(err,data){ console.log(data.email); 级别--; if(data.parent){ parent=data.parent.id; }else if(level==0 | | data.parent==nul
let updateInvitationRewards=函数(父级、级别、回调){
Service.customer.getOneCustomer({
_id:家长
},{},{},函数(err,data){
console.log(data.email);
级别--;
if(data.parent){
parent=data.parent.id;
}else if(level==0 | | data.parent==null)
收回(“结束”);
更新激励奖励(父级、级别--、回调);
});
};
更新激励奖励(父级、级别、函数(字符串){
console.log(字符串);
cb();
});
此查询给出的错误如下所示:
Error: Callback was already called.
请帮助我,我不熟悉这些类型的回调。在所有括号中,我们有:
if (data.parent) {
parent = data.parent.id;
} else if (level == 0 || data.parent == null) {
callback("end");
}
updateInvitationRewards(parent, level--, callback);
如果level
等于0或data.parent
为空,则触发回调,然后使用相同的回调进行updateInvitationRewards
要解决此问题,请执行以下操作:
if (data.parent) {
parent = data.parent.id;
} else if (level == 0 || data.parent == null) {
return callback("end"); // the execution stops here
}
updateInvitationRewards(parent, level--, callback);
在任何函数上,回调只能调用一次。如果多次调用回调,则
错误:回调已被调用。
将出现
从您的代码示例可以看出,函数将被递归调用。因此,当级别变为0或父级为空时,可能会出现错误
考虑以下场景,当级别为null或父级第一次调用回调时为null。但是递归调用将继续发生。假设在下一次执行中,如果父级为null,则将第二次调用回调,这将抛出错误
从代码中,我看不出level的用途,但我建议实现以下代码,以确保下次不会调用回调
let updateInvitationRewards = function(parent, level, callback) {
Service.customer.getOneCustomer({
_id: parent
}, {}, {}, function(err, data) {
console.log(data.email);
level--;
if (data.parent) {
parent = data.parent.id;
updateInvitationRewards(parent, level--, callback);
} else if (level == 0 || data.parent == null)
callback("end");
});
};
updateInvitationRewards(parent, level, function(string) {
console.log(string);
cb();
});
您是否可以尝试插入
updateInvitationRewards(父级、级别--、回调)代码>在if(data.parent)
条件中?为了数据清晰,我没有从这部分代码中删除插入代码…但是这大部分代码都给出了错误。。。回调已被调用..我不明白..当您多次调用回调函数时会出现错误。在代码中,当级别变为0或父级为null时,将调用回调。但是您的代码将继续调用udpateInvitationRewards,即使满足else if条件。因此,下次父对象为null时,将第二次调用回调。这可能会引发错误。非常感谢:)