Node.js - 异步,而循环不迭代

aly*_*lyx 1 javascript asynchronous node.js node-async

基于上一个问题Illegal break语句(Node.js)的建议,我实现了async.whilst(),但它不是多次迭代.

我试图找到一个唯一的ID,通过增加ID末尾的数字,并查询Mongo以查看该ID是否存在.如果它不存在,则找到唯一ID.它只循环一次,而不是找到唯一的.怎么了?

代码:

 var uniqueNumber = 1;
 var newUnique;

 async.whilst(
    function () { 

       var uniqueNum_string = uniqueNumber.toString(); 
       newUnique = data.id + uniqueNum_string;

       db.collection('landmarks').findOne({'id':newUnique}, function(err, data){

           if (data){
              console.log('entry found!');
              return;
           }

           else {
              console.log('entry not found!');

           }
        });

  },
  function (callback) {

     uniqueNumber++;

   },
   function (err) {

      saveLandmark(newUnique);
   }
);
Run Code Online (Sandbox Code Playgroud)

And*_*ren 6

我实际上找不到适合这个任务的好的异步函数,所以我使用async.forever()一起攻击了一些东西.该函数将继续运行,直到您回调"错误",这是您想要做的.

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}, 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);
});
Run Code Online (Sandbox Code Playgroud)

关于您要解决的问题,在我看来,您希望插入具有唯一ID的新文档.如果情况确实如此,你会经常这样做,我会说这是一种非常低效的方法.如果您在数据库中有一千个文档,那么在您接近唯一ID之前,您将对数据库执行一千个完全无意义的请求.

更好的方法是从集合中获取第一个文档按id降序(例如最高id).然后将该id增加1并尝试插入,直到它不被拒绝.因为即使您找到了唯一的ID,当您保存文档时,另一个插入可能是从另一个客户端或另一个实例(在负载平衡的情况下).在你的情况下,这可能是也可能不是问题,我对你的应用程序知之甚少,我只是认为你应该意识到你当前的方法和我的答案的缺点.