node.js Kette mehrere Versprechen (mit Mungo)
Im folgenden wird ein typisches Versprechen-Funktion, die ich bin den Umgang mit.
var _delete = function(t, id) {
return Promise.cast(Event.find({where: {id: id}}, {transaction: t}))
.then(function(d){
if (d) {
//------- (*)
return Promise.cast(d.updateAttributes({status: -1}, {transaction: t}))
.then(function(){
//do inventory stuff
return Promise.cast(Inventory.update({}).exec())
.then(function(d){
//do something
})
}).then(function(){
//do product stuff
return Promise.cast(Product.update({}).exec())
.then(function(d){
//do something
})
})
} else {
return Promise.reject('this transaction list does not exist');
}
});
};
Sieht ok bis Wann bin ich den Umgang mit komplizierter update /erstellt der code wird Recht chaotisch.
Derzeit, was ich Tue, mit dem Versprechen, dass
1. Ich habe eine Menge von nutzlos return true Aussagen, und der einzige Zweck ist, gehen Sie zum nächsten .then-Anweisung
2. Versprechen sind programmiert in ein verschachteltes Format. auch die input-Argumente sind in der Regel kompliziert und hat mehr als 1 Argumente so, dass ich etwas nicht tun kann, wie dies
.then(fun1).then(fun2)
... etc
das macht mich nicht 'tap'
die .then
Anweisung zum aktivieren/deaktivieren einer Funktion.
Also meine Frage ist wie mache ich das richtig? Danke..
folgenden ist die wirklich hässlichen Sachen, die ich spreche....
var _process = function(t, tid) {
var that = this;
return Promise.cast(Usermain.find({where: {transaction_id: tid}}))
.bind({}) //--- (*)
.then(function(d){
this.tmain = d;
return true; //---- do nothing, just go to next thennable (is this correct)
}).then(function(){
return Promise.cast(Userlist.findAndCountAll({where: {transaction_id: tid}}))
}).then(function(d){
this.tlist = d;
return true; //---- do nothing, just go to next thennable (is this correct)
}).then(function(){
if (this.tmain.is_processed) {
return Promise.reject('something is wrong');
}
if (this.tlist.count !== this.tmain.num_of_tran) {
return Promise.reject('wrong');
}
return Promise.resolve(JSON.parse(JSON.stringify(this.tlist.rows)))
.map(function(d){
if (d.is_processed) return Promise.reject('something is wrong with tran list');
return true; //goto next then
});
}).then(function(){
return Promise.cast(this.tmain.updateAttributes({is_processed: 1}, {transaction: t}));
}).then(function(){
return Promise.resolve(this.tlist.rows)
.map(function(d){
var tranlist = JSON.parse(JSON.stringify(d));
return Promise.cast(d.updateAttributes({is_processed: 1, date_processed: Date.now()}, {transaction: t}))
.then(function(d){
if (!d) {
return Promise.reject('cannot update tran main somehow');
} else {
if (tranlist.amount < 0) {
return Usermoney._payBalance(t, tranlist.user_id, -tranlist.amount);
} else {
return Usermoney._receiveBalance(t, tranlist.user_id, tranlist.amount);
}
}
});
});
});
}
JSON.parse(JSON.stringify(…))
s notwendig?Ich denke, wenn das array-Objekt ist BSON lodash wird etwas unerwartetes tun. Auch der ORM die ich verwende, ist sequelize und ich konnte nicht finden, dass intrinsische Methode, um den Fall der Rückgabe-Datentyp JSON..
Ich denke, Mungo-Instanzen haben eine
.toJSON
Methode, die dies tut (und das ist der Grund, warum JSON.stringify
funktioniert in den ersten Platz).Möchten Sie vielleicht einen Blick auf Wie bekomme ich Zugang zu früheren Versprechen, die Ergebnisse in eine .dann () - Kette?
hilfreich. wird im Hinterkopf behalten für die nun der Grund für den code ist ganz in ES5 immer noch..
InformationsquelleAutor Shih-Min Lee | 2015-01-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie zwei Dinge tun:
Rückrufe
In diesem Fall, unnesting könnte Folgendes machen (vorausgesetzt, Sie brauchen keine Verschlüsse in Ihren kommentierte Abschnitte):
Sicher, aktualisieren Sie einfach Ihre Frage.
ya danke das ist, wie ich am Ende tun, bevor die Verarbeitung aller späteren Abfragen / updates. (und speichern Zwischenergebnisse in
this
)InformationsquelleAutor Bergi
In meinen Projekten verwende ich Async.js
Denke ich, müssen Sie zu zerlegen Ihre
_process
Methode in kleinen Aktionenwaterfall
Muster verwendet werden könnten, hierHier ist ein Beispiel aus meiner app:
Entnehmen Sie bitte Async-docs für eine benutzerdefinierte Prozess, es funktioniert wirklich enthalten eine Menge von gemeinsamen mustern, habe ich auch diese Bibliothek verwenden, in meinem JavaScript-client.
Bitte, können Sie schreiben, die OP-spezifische code mit
async
, statt nur die Bereitstellung von Beispiel-code?Sorry Jungs, aktualisiert die Antwort 🙂
Ich aktualisierte die Antwort mit einem Ausschnitt aus meinem Projekt, hoffe, das hilft.
danke es ist nur so, dass ich vor kurzem umgestellt von "async" zu Versprechen..
InformationsquelleAutor sbedulin