2016-07-16 6 views
0

Ich habe while-Schleife in meinem Code und einige wenn Bedingungen drin. aber es macht nur die erste Runde. Diese Schleife ist ein Teil einer Funktion. Hier ist mein Code für diesen Teil:While-Schleife endet bei Null

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); 
     }; 

Was diese Schleife macht, ist, dass es sucht, wenn opts.medid1 in einen String in einem Array gleich ist, die result.media genannt wird. reesult.media [i] .mediaid sind die, die in meiner Datenbank existieren und das opts.medid1 ist das, was ich von der URL bekomme. Diese

ist, wie mein Schema 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} 
    ); 

Was mache ich falsch meine while-Schleife in der ersten Runde stecken zu verursachen, die i 0 drin ??

Vielen Dank im Voraus.

Antwort

1

Der Grund, warum der Code bei seiner ersten Iteration() beendet wurde, lag an der break-Anweisung.

Basierend auf dem obigen Code, das ist, wie Sie Ihren Code-Pfad wie

in die do while loop
  • initialisieren einige Variablen
  • Unter der Annahme Bedingung (opts.medid1 == resmedid) erfüllt ist, weiter auf aussehen würde
    1. Go.
    2. Anruf user.findOneAndUpdate und da es sich um einen asynchronen Anruf handelt, wird der Code weitergehen, ohne darauf warten zu müssen, dass er ausgeführt wird.
    3. Code liest break Anweisung und beendet, ohne die erste Runde der Schleife zu beenden.

    nicht sicher, was die Pause Aussage Absicht war, aber ich vermute, dass es in erster Linie nur ein Copy-Paste-Fehler sein könnte, weil es überhaupt nicht in den Code zu passen scheint. Auch aufgrund der fehlausgerichteten Absicht sieht die break-Anweisung so aus, als gehöre sie zur Callback-Funktion von user.findOneAndUpdate thou.

    Ich habe Ihren Code neu eingerückt, um die break besser unterscheidbar zu machen, dass es nicht zum Rückruf gehört.

    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); 
    

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

  • +0

    Vielen Dank für mich zu beantworten. das "break" gibt es, weil ich möchte, dass es aus der Schleife kommt, wenn es das Match gefunden und gelöscht hat. Ich habe das ganze if und else in der Schleife kommentiert und mache einfach 'console.log (i)' und es funktioniert immer noch nicht !! –

    +0

    Lass es mich wissen, wenn es dein Problem löst. Gerne noch einmal schauen, ob das Problem noch da ist. –

    +0

    auch kommt es nicht aus der Schleife !! wenn ich nur 'console.log (i)' in die Schleife setze, drucke einfach 0! –