recursion调用node.js中的asynchronous函数
我写了一个recursion查询来以数据库级别或分层方式更新数据。
我写了这个代码:
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.
请帮助我我是新来的这些types的callback。
所有的括号,我们有:
if (data.parent) { parent = data.parent.id; } else if (level == 0 || data.parent == null) { callback("end"); } updateInvitationRewards(parent, level--, callback);
如果level
等于0或data.parent
为null,则callback触发器,然后使用相同的callback函数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);
在任何函数上, callback只能被调用一次 。 如果不止一次调用callback,那么Error: Callback was already called.
会来。
从您的代码示例中,可以看到该函数将被recursion调用。 所以当等级变为0或者父母为空时可能会出现错误。
考虑以下情况,当级别为null或父类为null时,第一次调用callback。 但recursion调用将继续发生。 假设在下一次执行中,如果父项为空,则第二次调用该callback,并引发错误。
从代码中我看不出什么是level的用法,但是我build议下面的代码来实现,这样可以确保下一次不会调用callback函数。
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(); });