2016-07-16 28 views
0

私のコードではwhileループがあり、それには条件があります。しかしそれは最初のラウンドを行うだけです。このループは関数の一部です。ここでは、この部分のための私のコードは次のとおりです。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である:私は私はそれでは0である最初のラウンドで立ち往生私のwhileループを引き起こすことが間違って何をやっている

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

ありがとうございます。

答えて

1

最初の繰り返しでコードが終了する理由(i = 0)は、breakステートメントのためです。

上記のコードに基づいて、これはあなたのコードパスは次のようになりますどのように、

  1. ゴーdo while loop
  2. に条件(opts.medid1 == resmedid)が満たされたと仮定すると、いくつかの変数
  3. を初期化し、続行。
  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

感謝。それが見つかった場合にループから抜け出し、それを削除したいからです。私はループ内のすべてのifとelseをコメントし、単に 'console.log(i)'を実行しますが、それでも動作しません!! –

+0

あなたの問題を解決するかどうか教えてください。問題がまだ残っていればもう一度見てください。 –

+0

またループから外れません!!私が 'console.log(i)'をループに入れただけでは、単に0が出力されます! –

関連する問題