非法break语句(Node.js)

尝试在Node.js和MongoDB中查找唯一标识,方法是创build一个查询MongoDB现有标识的while循环,直到find唯一值。 如果这个ID已经被使用了,那末一个数字就会增加,直到Mongo什么也没有返回。

除了break;之外,一切都在工作break; 声明何时find唯一的ID。 Node.js返回: SyntaxError: Illegal break statement

代码:

 db.collection('landmarks').findOne({'id':uniqueIDer}, function(err, data){ //if ID exists already if (data.id){ var uniqueNumber = 1; while (1) { var uniqueNum_string = uniqueNumber.toString(); var newUnique = data.id + uniqueNum_string; db.collection('landmarks').findOne({'id':newUnique}, function(err, data){ if (data.id){ uniqueNumber++; } else { saveLandmark(newUnique); break; } }); } } else { saveLandmark(uniqueIDer); } }); 

我究竟做错了什么?

编辑:

这是固定的代码使用asynchronous如果任何人需要它:)

  db.collection('landmarks').findOne({'id':uniqueIDer}, function(err, data){ if (data){ var uniqueNumber = 1; var newUnique; async.forever(function (next) { var uniqueNum_string = uniqueNumber.toString(); newUnique = data.id + uniqueNum_string; db.collection('landmarks').findOne({'id':newUnique,'world':worldVal}, function(err, data){ if (data){ console.log('entry found!'); uniqueNumber++; next(); } else { console.log('entry not found!'); next('unique!'); // This is where the looping is stopped } }); }, function () { saveLandmark(newUnique); }); } else { saveLandmark(uniqueIDer); } }); 

你的break语句不在循环体内。 它是在一个函数的内部,即findOnecallback。 要更清楚地看到这一点,暂时使用一个命名函数作为callback处理程序会很有帮助:

 var cb = function(err, data){ if (data.id){ uniqueNumber++; } else { saveLandmark(newUnique); break; // not inside a loop! } }; db.collection('landmarks').findOne({'id':uniqueIDer}, function(err, data){ //if ID exists already if (data.id){ var uniqueNumber = 1; while (1) { var uniqueNum_string = uniqueNumber.toString(); var newUnique = data.id + uniqueNum_string; db.collection('landmarks').findOne({'id':newUnique}, cb); } } else { saveLandmark(uniqueIDer); } }); 

现在很清楚,callback函数体中的break不在循环内! 我也以其他方式让事情破裂,因为uniqueNumbernewUnique值不在范围内,但是这是一个不同的问题。 :)在这里看到的重要的事情是一个函数在你的代码中引入了一个“硬”的边界,这个边界可能很难看清纯粹的语言语法。 这就是为什么这种callback编程风格如此棘手以至于无法正确使用的原因之一。

事实上,要做到这一点要比在代码中的初始尝试意味着要困难得多。 您需要有一种方式,通过可能任意的callback层将成功信号传递给您,反复调用findOne并分析结果(asynchronous)。

您可以通过使用优秀的async库,例如https://github.com/caolan/async#whilst获得一些帮助。