2016-04-25 10 views
1

Ich habe den folgenden Code. Aber das sieht ähnlich wie eine Rückruf-Hölle aus. Wie kann ich diesen Code zu einem richtigen Versprechen WegOrganisieren Versprechen Code

FacilityBooking.forge({ 
      "booking_id": req.params.id 
     }) 
     .fetch({ 
      require: true 
     }) 
     .then(function(collection) { 
      if(0) { //@todo check if admin 
       throw new NotAuthorised(CFG_MESSAGES.error[403]); 
      } else { 
       Bookshelf.transaction(function(t) { 
        collection 
         .save({ 
          "is_valid": 0, 
          "updated_by": req.user.id 
         }, {transacting: t}) 
         .tap(function(model) { 
          new FacilityBooking(model.toJSON()) 
           .save({ 
            "is_valid": 1, 
            "reason_for_reject": req.body.disapprovereason || '' , 
            "status": approval_status[req.body.moderation_action] 
           }, {transacting: t}) 
           .then(function(collection) { 
            res.json({ 
             status: true, 
             message: CFG_MESSAGES.facility_booking.moderate.success 
            }); 
           }) 
           .catch(function(err) { 
            res.json({ 
             status: false, 
             message: CFG_MESSAGES.facility_booking.moderate.error 
            }); 
           }); 
         }); 
       }); 
      } 
     }) 
     .catch(function(err) { 
      ErrorHandler.handleError(res, err); 
     }); 
+1

Warum Inline alles unter Code überprüfen? –

+0

bedeutet ??????????? – aWebDeveloper

+0

Werfen Sie einen Blick auf die Antwort von Enrmarc. –

Antwort

0

Ich habe versucht, Ihre Frage zu beantworten bitte

Bookshelf.transaction(function(t) { 
     FacilityBooking.forge({ 
       "booking_id": req.params.id 
      }) 
      .fetch({ 
       require: true 
      }) 
      .then(function(collection) { 
       if(0) { //@todo check if admin 
        throw new NotAuthorised(CFG_MESSAGES.error[403]); 
       } else { 
        return collection 
         .save({ 
          "is_valid": 0, 
          'updated_by': req.user.id 
         }, { 
          transaction: t, 
          patch: true 
         }); 
       } 
      }) 
      .then(function(model) { 
       var data = model.toJSON(); 
       delete data.id; 
       return new FacilityBooking(data) 
         .save({ 
          "is_valid": 1, 
          "reason_for_reject": req.body.disapprovereason || 'bbbbbbbbbbb' , 
          "status": approval_status[req.body.moderation_action] 
         }, { 
          transaction: t, 
          method: 'insert' 
         }) 
      }) 
      .then(function(collection) { 
       res.json({ 
        status: true, 
        message: CFG_MESSAGES.facility_booking.moderate.success 
       }); 
      }) 
      .catch(function(err) { 
       res.json({ 
        status: false, 
        message: CFG_MESSAGES.facility_booking.moderate.error 
       }); 
      }) 
    }); 
2

Nun, Sie können es in Funktionen teilen reorganisieren:

var onErrorProcessingBooking = function(err) { 
    ErrorHandler.handleError(res, err); 
}; 

var tap = function(model) { 

    var onSuccessSave = function(collection) { 
    res.json({ 
     status: true, 
     message: CFG_MESSAGES.facility_booking.moderate.success 
    }); 
    }; 

    var onErrorSave = function(err) { 
    res.json({ 
     status: false, 
     message: CFG_MESSAGES.facility_booking.moderate.error 
    }); 
    }; 

    new FacilityBooking(model.toJSON()) 
    .save({ 
     "is_valid": 1, 
     "reason_for_reject": req.body.disapprovereason || '', 
     "status": approval_status[req.body.moderation_action] 
     }, {  
     transacting: t 
    }) 
    .then(onSuccessSave) 
    .catch(onErrorSave); 
} 

var onSuccessProcessingBooking = function(collection) { 
    if (0) { 
    throw new NotAuthorised(CFG_MESSAGES.error[403]); 
    return; 
    } 

    Bookshelf.transaction(function(t) { 
    collection 
     .save({ 
     "is_valid": 0, 
     "updated_by": req.user.id 
     }, { 
     transacting: t 
     }) 
     .tap(tap); 
    }); 
} 


FacilityBooking 
    .forge({"booking_id": req.params.id}) 
    .fetch({require: true}) 
    .then(onSuccessProcessBooking) 
    .catch(onErrorProcessingBooking); 
2

Promises Kette, then ist eine Abstraktion über Flusssteuerung selbst und Sie können ein Versprechen von einem anderen Versprechen zurückgeben. Noch besser wäre es, können Sie Koroutinen Verwendung dieses mit drossel kümmern, die bereits im Bücherregal enthalten ist:

const forger = Promise.coroutine(function*() { 
    const collection = yield FacilityBooking.forge({ "booking_id": req.params.id }) 
              .fetch({ require: true });  
    if(0) throw new NotAuthorised(CFG_MESSAGES.error[403]); 
    yield Bookshelf.transaction(Promise.coroutine(function *(t) { 
    yield collection.save({ 
     "is_valid": 0, 
     "updated_by": req.user.id 
    }, {transacting: t}); 
     const model = new FacilityBooking(model.toJSON()); 
     yield model.save({ 
     "is_valid": 1, 
     "reason_for_reject": req.body.disapprovereason || '' , 
     "status": approval_status[req.body.moderation_action] 
    }, {transacting: t}); 
    res.json({ 
     status: true, 
     message: CFG_MESSAGES.facility_booking.moderate.success 
    }); 
    })); 
}).catch(function(err) { 
    // filter error here, and do the res.json with the failure here 
    if(isRelevantError) { 
    res.json({ 
     status: false, 
     message: CFG_MESSAGES.facility_booking.moderate.error 
    }); 
    } 
    ErrorHandler.handleError(res, err); 
}); 
+0

Wie macht dies den Fluss weniger "Callback-Hölle"? Die Verwendung eines Generators hilft bei dieser Frage nicht. –

+0

@ elad.chen was meinst du? OP-Code behandelte Ausnahmen nicht korrekt und verschachtelte ohne Grund - dieser Code leidet nicht an einem der beiden Probleme. –

+0

Ignoriere meinen Kommentar. Lies zu schnell. –