Javascript 组织承诺代码

Javascript 组织承诺代码,javascript,promise,bluebird,bookshelf.js,Javascript,Promise,Bluebird,Bookshelf.js,我有以下代码。但这看起来就像一个地狱。如何以更合适的方式重新组织此代码 FacilityBooking.forge({ "booking_id": req.params.id }) .fetch({ require: true }) .then(function(collection) { if(0) { //@todo check if admin

我有以下代码。但这看起来就像一个地狱。如何以更合适的方式重新组织此代码

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

你可以把它分成几个函数:

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

你可以把它分成几个函数:

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

承诺链,
然后
是对流控制本身的抽象,您可以从另一个承诺返回一个承诺。更好的是,您可以使用协同程序来处理bluebird,bluebird已经包含在书架中:

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

承诺链,
然后
是对流控制本身的抽象,您可以从另一个承诺返回一个承诺。更好的是,您可以使用协同程序来处理bluebird,bluebird已经包含在书架中:

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

我试图回答你的问题,请检查下面的代码

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

我试图回答你的问题,请检查下面的代码

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


为什么要内联所有内容?看看enrmarc的答案。为什么要使用
点击
而不是
然后
事务
不希望您的回调返回一个承诺吗?它本身是否返回一个承诺?为什么内联所有内容的可能重复?看看enrmarc的答案。为什么使用
点击
而不是
然后
事务
难道不期望您回调
返回一个承诺吗?它本身是否返回了一个承诺?这可能是一个重复,如何使流不那么“回调地狱”?使用发电机对这个问题没有帮助。@elad.chen你是什么意思?OPs代码没有正确处理异常,并且没有任何原因嵌套-此代码没有任何问题。忽略我的注释。读得太快。没有es6 plz。你能给我一个es5的吗。由于meNode是在ES2015上构建的,所以您的代码有点难以理解,您可以在节点中使用它,而无需担心任何问题。还有,哪一部分很难理解?你在bluebird网站上读过Promise.coroutine文档了吗?这是如何让流量减少“回调地狱”的?使用发电机对这个问题没有帮助。@elad.chen你是什么意思?OPs代码没有正确处理异常,并且没有任何原因嵌套-此代码没有任何问题。忽略我的注释。读得太快。没有es6 plz。你能给我一个es5的吗。由于meNode是在ES2015上构建的,所以您的代码有点难以理解,您可以在节点中使用它,而无需担心任何问题。还有,哪一部分很难理解?你在bluebird网站上看过Promise.coroutine文档了吗?