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文档了吗?