繁体   English   中英

在node.js中的异步函数中的递归调用

[英]Recursive call in Asynchronous function in node.js

我编写了一个递归查询来以数据库级别或分层方式更新数据。

我写了这段代码:

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.

请帮助我,我是这些类型的回调的新手。

使用所有括号,我们有:

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,则回调是触发器,然后是具有相同回调的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只应该被调用一次 如果多次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();
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM