node.js la chaîne de multiples promesses (avec mangouste)

Voici un exemple typique de la promesse de la fonction que j'ai affaire avec.

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

Cela semble ok jusqu'à ce que, quand je fais affaire avec plus compliqué de mise à jour /crée le code deviendra vraiment salissant.

Actuellement ce que je fais avec la promesse que
1. J'ai beaucoup de inutile de retour des déclarations exactes et le seul objectif est de passer à la suivante .l'état
2. promesse qui sont programmés dans un style imbriqué. aussi les arguments d'entrée sont en général très complexes et n'a plus ensuite qu'1 arguments, de sorte que je ne peux pas faire quelque chose comme ceci

.then(fun1).then(fun2)

... etc

qui me rend incapable de 'tap' la .then instruction pour activer/désactiver une fonctionnalité.

Donc ma questions est de savoir comment dois-je faire cela correctement? Merci..


la suite est vraiment laid choses que je suis en train de parler....

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);
}
}
});
});
});
}
  • Pourquoi ceux JSON.parse(JSON.stringify(…))s nécessaire?
  • Je pense que lorsque l'objet array est BFILS lodash va faire quelque chose d'inattendu. Aussi l'ORM que j'utilise est sequelize et je n'arrivais pas à trouver la méthode de la valeur intrinsèque pour le cas où le retour à type de données JSON.
  • Je pense que la mangouste instances ont un .toJSON méthode qui est-ce (qui est la raison pour laquelle JSON.stringify travaille en premier lieu).
  • Vous pouvez avoir un coup d'oeil à Comment puis-je accéder précédente promettent des résultats dans un .alors() de la chaîne?
  • utile. allons garder cela à l'esprit pour cause maintenant le code est entièrement dans l'ES5 encore..
InformationsquelleAutor Shih-Min Lee | 2015-01-14