2016-04-08 9 views
0

Ich habe Probleme beim Erweitern einer Promise innerhalb einer . Ich versuche DB-Updates in einer for-Schleife durchzuführen und schließe dann die Datenbank, nachdem alle Datensätze verarbeitet wurden. Die Anwendung wird jedoch sofort mit process.exit() beendet, was bedeutet, dass process.exit() ausgeführt wurde, noch bevor alle Datenbankaktualisierungen abgeschlossen wurden. Ich bin mir ziemlich sicher, dass ich mit dem verschachtelten Versprechen etwas falsch mache.Geschachteltes Versprechen in einer for-Schleife, die sich nicht wie erwartet verhält

var myDB; 

function doSomething() { 
    return MongoClient.connect(DB_CONNECTION).then(function(db) { 
     myDB = db; 
     var collection = db.collection(COLLETION_NAME); 
     for (var i = 0; i < 10; i++) { 

      promise.then(function{ 
       collection.update({ 
        symbol: items[i].symbol 
       }, { 
        $set: { 
         value: 123 
        } 
       }, { 
        upsert: true 
       }); 
      }); 
     } 
    }) 
} 

var promise = doSomething(); 
promise.then(function(){ 
    console.log("DONE"); 
    myDB.close(); 
    process.exit(); 
}); 
+0

Nun ist die Funktion' Funktion doSomething (Versprechen) 'und Sie‘ re nennen es wie 'var promise = doSomething()', ohne irgendein Versprechen zu bestehen. Eine andere Sache ist, dass innerhalb Ihrer db Callback 'Funktion (db)' Sie ** keine Versprechen ** noch irgendeine Art von Ergebnis, daher kann es nicht verkettet werden. –

+2

['Promise.all'] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/all) – Rayon

+0

@AndreyPopov danke für den Kommentar. Ich verstehe, dass ich etwas falsch mache, das Problem ist, dass ich Probleme habe, es zu beheben. Wie ändere ich es, um ein Versprechen innerhalb einer for-Schleife zurückzugeben? –

Antwort

0

aktualisiert Code gemäß @RayonDabre ‚s Vorschlag

function doSomething() { 
    return MongoClient.connect(DB_CONNECTION).then(function(db) { 
     myDB = db; 
     var collection = db.collection(COLLECTION_NAME); 
     var promises = []; 

     for (var i = 0; i < 10; i++) { 
      var innerPromise = collection.update({ 
       symbol: items[i].symbol 
      }, { 
       $set: { 
        value: 123 
       } 
      }, { 
       upsert: true 
      }); 
      promises.push(innerPromise); 
     } 
     return Promise.all(promises); 
    }); 
} 


var promise = doSomething(); 
promise.then(function(){ 
    console.log("DONE"); 
    myDB.close(); 
    process.exit(); 
}); 
1

Es sieht so aus, als ob Sie von der MongoClient.connect-Methode ein Versprechen erhalten, warum also nicht zusammen verwenden. Ich habe zusammen eine schnelle Probe gestellt unten basierend auf Ihren Code:

function doSomething(db) { 
    return new Promise(function(resolve, reject){ 
     var collection = db.collection(COLLETION_NAME); 
     for (var i = 0; i < 10; i++) { 
      collection.update({ 
       symbol: items[i].symbol 
      }, { 
       $set: { 
        value: 123 
       } 
      }, { 
       upsert: true 
      }); 
     } 

     resolve(db); 
    }) 
} 

function connectToDB() { 
    return MongoClient.connect(DB_CONNECTION); 
} 

function closeDB(db) { 
    return new Promise(function(resolve, reject){ 
     db.close(); 
     resolve(); 
    }); 
} 

connectToDB().then(function(db){ 
    return doSomething(db); 
}).then(function(db){ 
    return closeDB(db); 
}).then(function(){ 
    console.log("DONE"); 
    process.exit(); 
}).catch(function(error){ 
    console.log('Something went wrong: ' + error); 
}); 
+0

Schön und sauber. Gut gemacht :) –

Verwandte Themen