【问题标题】:Why is this callback function being called infinitely?为什么这个回调函数被无限调用?
【发布时间】:2015-05-27 07:18:48
【问题描述】:

我正在递归调用一个函数,它的回调函数 done() 被无限调用,我不知道为什么。

当我记录i时,它达到数据的长度,然后满足条件并停止,但done函数被无限调用。 done 函数不是递归的;为什么它被多次调用?当增量器等于数据长度并且定义了 nTwo 时,如何让它只被调用一次?

我认为这可能是因为 i 的预增量,但我需要这样,否则我会得到 RangeError,Maximum Stack Exceeded。

function train(i, data, n, nTwo, func){
    console.log(i, i===data.length);
    if(i===data.length && nTwo===undefined) func();
    else if(i<data.length) (new Trainer(n)).workerTrain([data[i]], train(++i, trainingSet, l, y));
    else done();
}
function done(){
    console.log('first set of workers done');
    saveAs(new Blob([JSON.stringify(l.toJSON())], {type: "application/json"}), "l.json");
    train(0, yonTraining, y, undefined, finalTrainingCallback);
}

【问题讨论】:

  • 请添加所需的代码以创建可测试的内容:未解释函数 done()、func()、Trainer 和 Trainer.workerTrain。如果……其他情况,请在你身上使用花括号
  • 我们需要更多数据。调用done() 的唯一方法是i &gt; data.length。现在,在您进行编辑之后,done 似乎再次使用0i 调用train,因此它可以在某种程度上是递归的。
  • @OmriAharon 更新了 done 的定义。
  • yonTraining 里有什么?
  • 我知道为什么 done 最终会被无限调用(还有train),但我看不到done 是如何被调用的。调用done 的最后一个if 的入口点处的idata.length 是什么?

标签: javascript recursion infinite-loop


【解决方案1】:

很明显,函数train 正在调用函数done,它又调用了函数train。然后函数train递增索引i直到其值大于data.length,再次调用done函数

【讨论】:

    猜你喜欢
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    • 2021-12-19
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多