Verspricht innerhalb einer setInterval
Habe ich eine setInterval
läuft ein Versprechen, jede Sekunde, innerhalb der dann die Funktion jedes Versprechen, ich habe die Ausgabe in eine MongoDB-Datenbank (obwohl aus irgendeinem Grund funktioniert es nicht).
Ich will schließen der Verbindung zur Datenbank, wenn alles fertig ist, aber ich weiß nicht, wie Sie, um das schließen der Verbindung werden nur ausgeführt, wenn alle Versprechungen werden gemacht und alles abgeschlossen hat schriftlich an die DB.
Hier ist mein Derzeitiger code:
Habe ich eine client.js
- Datei, gemeint ist die Ausgabe der Abfrage in einem shop mit einem Versprechen, und ein db.js
bedeutete zu behandeln, DB-Funktionalität.
client.js
var id = setInterval(function(){
if (i == (categories.length-1))
clearInterval(id);
var category = categories[i];
client.itemSearch({
searchIndex: SearchIndex,
categoryID: category.id,
keywords: currentKeyword
})
.then(function(results){
var title = results[0].Title;
var cat = category.name;
var price = results[0].Price
db.insertProduct(title,cat,price).then(function(){
console.log("Added " + title);
})
},function(err) {
console.log("error at " + category.name);
});
i+=1;
}, 1000)
queryStore();
db.js
var mongoose = require("mongoose");
mongoose.connect('mongodb://localhost:27017/catalog');
var schema = new mongoose.Schema({
title : String,
category : String,
price : Number,
}, {collection: "catalog"});
var Product = mongoose.model("Product", schema);
Product.remove({}, function() {
console.log('Database cleared.')
});
exports.clearDB = function() {
Product.remove({});
}
exports.insertProduct = function (Title,Category,Price) {
var entry = new Product({
title: Title,
category: Category,
price: Price,
});
entry.save();
}
exports.closeConn = function() {
console.log("Closing DB Connection");
mongoose.connect().close();
}
Auch, da bin ich absolut neu auf JavaScript und Node.js allgemein, best practices oder Allgemeine Tipps werden sehr geschätzt! 🙂
- Versprechungen werden nicht "ausgeführt", werden Sie nur werden erstellt.
- Ich wirklich empfehlen, nicht zu verwenden
setInterval
zusammen mit dem Versprechen. PromisifysetTimeout
und nur die verwenden. - könnten Sie das näher erläutern? Ich bin mir nicht sicher, ob ich verstehe, was das bedeutet
- Wenn Sie Verweise auf meinen ersten Kommentar, es geht nur um die Terminologie. Versprechungen sind Werte, etwas, das nicht ausgeführt werden kann.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Geschrieben, Sie verlassen sich auf ein 1-Sekunden-Intervall zu verhängen, um eine Verzögerung zwischen aufeinander folgenden aufrufen einer Suche/Sequenz einfügen. Es gibt nichts grundlegend falsch mit, dass, aber es muss nicht garantieren, dass jeder Schritt abgeschlossen ist, bevor die nächste beginnt, und garantiert nicht, dass der nächste Schritt beginnt so bald wie möglich. Bei jedem Schritt, die 1 Sekunde Verzögerung kann mehr als ausreichend, oder weniger als ausreichend, die Sie nicht wirklich kennen.
Glücklicherweise verspricht bieten eine viel bessere Weise zu bewältigen, die asynchronism.
Beginnend mit einem array, einer bewährten
reduce
Muster zur Verfügung (siehe "Die Sammlung Kerfuffle" hier zu verhängen, um eine Sequenz :wo
Promise
ist ES6 native Versprechen, oder zB Bluebird.Für den code in der Frage, die
doSomethingAsync()
Teil erweitert zu geben :Den gesamten reduktionsverlauf gibt eine Verheißung, die sich selbst zurückgegeben werden und/oder aggregiert mit anderen verspricht.
promise
ist "thenable" in der ersten iteration. Die starter Versprechen gelöst werden muß (irgendwann) zu gewährleisten, dass die Versprechen Kette aufgebaut, die durch die Reduzierung der Prozess beginnt zu begleichen. In der Erwägung, dass es typisch ist, in dieses Muster, für die starter Versprechen bereit zu sein-gelöst (wie oben), könnte es ein Versprechen, dass wird zu einem späteren Zeitpunkt gelöst, in Antwort auf einige asynchronism.Promise.resolve(queryStore())
zurück ein Versprechen gelöst mit dem, wasqueryStore()
gibt. WennqueryStore()
schon passiert, um zurückzukehren ein Versprechen, keine sorgen -Promise.resolve()
ist schlau genug zu wissen, nicht "double-wrap" ist der zurückgegebene Wert.return catagories.reduce(function(promise, category) {
hat den trick, und das hinzufügen zurück in die Datenbank speichern-Funktion gemacht, damit es nicht schließen, bevor alles eingegeben wurde, an die db. Wieder einmal, vielen Dank für all die Hilfe!