2016-04-25 12 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

私のコメントは無視してください。あまりにも速く読む。 –