2016-04-25 44 views
1

我有以下代碼。但是這看起來類似於回調地獄。如何重新組織該代碼到一個更合適的承諾方式組織承諾代碼

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

爲什麼直列一切嗎? –

+0

的意思是????? – aWebDeveloper

+0

看看enrmarc的答案。 –

回答

0

我想回答你的問題,請檢查下面的代碼

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

嗯,你正好可以把它分爲功能:

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

承諾鏈,then結束了流量控制的抽象本身,你可以從另一個承諾返回一個承諾。更重要的是,你可以用協程來照顧這與已經包含在書架藍鳥:

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

這是如何使流量減少「回撥地獄」?使用發電機並不能解決這個問題。 –

+0

@ elad.chen你是什麼意思? OPs代碼沒有正確處理異常並且沒有任何理由嵌套 - 這個代碼不會遇到任何問題。 –

+0

忽略我的評論。閱讀太快。 –