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。

Solutions Collecting From Web of "recursion调用node.js中的asynchronous函数"

所有的括号,我们有:

 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(); });