在node.js

时间:2016-06-29 13:21:53

标签: javascript node.js recursion mongoose

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

我写了这段代码:

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.

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

2 个答案:

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