非法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
语句不在循环体内。 它是在一个函数的内部,即findOne
callback。 要更清楚地看到这一点,暂时使用一个命名函数作为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
不在循环内! 我也以其他方式让事情破裂,因为uniqueNumber
和newUnique
值不在范围内,但是这是一个不同的问题。 :)在这里看到的重要的事情是一个函数在你的代码中引入了一个“硬”的边界,这个边界可能很难看清纯粹的语言语法。 这就是为什么这种callback编程风格如此棘手以至于无法正确使用的原因之一。
事实上,要做到这一点要比在代码中的初始尝试意味着要困难得多。 您需要有一种方式,通过可能任意的callback层将成功信号传递给您,反复调用findOne
并分析结果(asynchronous)。
您可以通过使用优秀的async
库,例如https://github.com/caolan/async#whilst获得一些帮助。