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);
            }
          }
      });
    });
  });
}
Warum sind diese 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

Schreibe einen Kommentar