我编写了一个递归查询来以数据库级别或分层方式更新数据。
我写了这段代码:
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;
} else if (level == 0 || data.parent == null)
callback("end");
updateInvitationRewards(parent, level--, callback);
});
};
updateInvitationRewards(parent, level, function(string) {
console.log(string);
cb();
});
此查询出现如下错误:
Error: Callback was already called.
请帮助我,我是这些回调的新手。
答案 0 :(得分:2)
使用所有括号,我们有:
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);
答案 1 :(得分:1)
在任何功能上, Callback只能调用一次。如果多次调用回调,Error: Callback was already called.
就会出现。
从您的代码示例中可以看出该函数将被递归调用。因此,当级别变为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();
});