2016-07-16 71 views
0

我有while循环在我的代码和一些如果条件。但它只是做第一轮。这个循环是一个函数的一部分。这里是我的这部分代码:虽然循环结束于零

else{ 
      var i = 0; 
      do{ 
       var resmedid = (result.media[i].mediaid); 
       var len = result.media.length 
       if(opts.medid1 == resmedid){ 
        var query = {tokenid: opts.token1} 
        user.findOneAndUpdate(query, {$pull: {media: {_id: result.media[i]._id}}},function(err, result2){ 
        if (err){ 
         console.error(err); 
         callback(new Error('System Error')); 
         return; 
         } 
        else{ 
         result = 'updated'; 
         callback(null, result); 
         return; 
         } 
        }); 
        break; 
        } 
       if (i == len){ 
        console.log(i = len); 
         result = 'not match'; 
         callback(null, result); 
         return; 
        } 
       i++; 
      } 
      while(i < result.media.length); 
     }; 

什么这个循环的作用是,它正在寻找如果opts.medid1等于在被称为result.media数组的字符串。 reesult.media [i] .mediaid是我的数据库中存在的那些,opts.medid1是我通过url获得的。

这是怎么了我的架构looklike:

var userschema = new mongoose.Schema({ 
    userid: {type: String, unique: true}, 
    tokenid: {type: String, sparse: true, default: null}, 
    media: [{ 
    mediaid: String, 
    mediaurl: String 
    }]}, 
    {versionKey: false} 
    ); 

我在做什么错误导致滞留在第一轮,我是在它0我while循环?

在此先感谢。

回答

1

代码在第一次迭代(i = 0)上退出的原因是因为break声明。

此基础上你的代码,这是你的代码路径会是什么样子,

  1. 进入了do while loop
  2. 初始化一些变量
  3. 假设条件(opts.medid1 == resmedid)满足,继续。
  4. 致电user.findOneAndUpdate由于它是一个异步调用,代码将继续前进,无需等待它完成执行。
  5. 代码读取break声明并退出,无需完成第一轮循环。

不知道什么突破声明的意图,但我怀疑主要是因为它似乎不适合的代码在所有它可能只是一个复制粘贴错误。同样由于意向不一致,break声明确实看起来像属于您的回调函数user.findOneAndUpdate

我已经重新缩进了你的代码,使break更加区分它不属于回调。

do { 
    var resmedid = (result.media[i].mediaid); 
    var len = result.media.length 
    if(opts.medid1 == resmedid) { 
     var query = {tokenid: opts.token1} 
     // Note: Async call, code will move on without waiting for it to finish 
     user.findOneAndUpdate(query, {$pull: {media: {_id: result.media[i]._id}}},function(err, result2){ 
      if (err) { 
       console.error(err); 
       callback(new Error('System Error')); 
       return; 
      } 
      else{ 
       result = 'updated'; 
       callback(null, result); 
       return; 
      } 
     }); 
     // Note the break here. This is called right after user.findOneAndUpdate is called 
     break; 
    } 
    if (i == len) { 
        .... 
    } 
    i++; 
} while(i < result.media.length); 

参考: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/break

+0

谢谢回答我。那里有'break',因为如果它找到匹配并将其删除,我希望它离开循环。我评论了所有的if和else循环,只是做'console.log(i)',它仍然不起作用! –

+0

让我知道它是否可以解决您的问题。如果问题仍然存在,很高兴再次看看。 –

+0

它也不会出现循环!如果我只是把'console.log(i)'放入循环中,它只是打印0! –