Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript node.js中异步函数的递归调用_Javascript_Node.js_Recursion_Mongoose - Fatal编程技术网

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时,将第二次调用回调。这可能会引发错误。非常感谢:)