2016-07-16 99 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! –