【发布时间】: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 > data.length。现在,在您进行编辑之后,done似乎再次使用0为i调用train,因此它可以在某种程度上是递归的。 -
@OmriAharon 更新了 done 的定义。
-
yonTraining里有什么? -
我知道为什么 done 最终会被无限调用(还有
train),但我看不到done是如何被调用的。调用done的最后一个if的入口点处的i和data.length是什么?
标签: javascript recursion infinite-loop