В одной из моих функций beforeSave мне нужно проверить ряд условий, прежде чем отвечать на них с успехом или ошибкой.Очистка кода спагетта с обещаниями
Проблема заключается в том, мой код кажется очень грязный, а иногда успех/ошибка не называется:
Parse.Cloud.beforeSave("Entry", function(request, response) {
var entry = request.object;
var contest = request.object.get("contest");
entry.get("user").fetch().then(function(fetchedUser) {
contest.fetch().then(function(fetchedContest) {
if (fetchedUser.get("fundsAvailable") < fetchedContest.get("entryFee")) {
response.error('Insufficient Funds.');
} else {
fetchedContest.get("timeSlot").fetch().then(function(fetchedTimeSlot) {
var now = new Date();
if (fetchedTimeSlot.get("startDate") < now) {
response.error('This contest has already started.');
} else {
contest.increment("entriesCount");
contest.increment("entriesLimit", 0); //have to do this, otherwise entriesLimit is undefined in save callback (?)
contest.save().then(function(fetchedContest) {
if (contest.get("entriesCount") > contest.get("entriesLimit")) {
response.error('The contest is full.');
} else {
response.success();
}
});
}
});
}
});
});
});
Я пытался узнать обещания навести порядок в этом, и здесь был мой (не удалось) попытка:
Parse.Cloud.beforeSave("Entry", function(request, response) {
var entry = request.object;
var contest = request.object.get("contest");
entry.get("user").fetch().then(function(fetchedUser) {
contest.fetch().then(function(fetchedContest) {
if (fetchedUser.get("fundsAvailable") < fetchedContest.get("entryFee")) {
response.error('Insufficient Funds.');
}
return fetchedContest;
});
}).then(function(result) {
result.get("timeSlot").fetch().then(function(fetchedTimeSlot) {
var now = new Date();
if (fetchedTimeSlot.get("startDate") < now) {
response.error('This contest has already started.');
}
});
}).then(function() {
contest.increment("entriesCount");
contest.increment("entriesLimit", 0);
contest.save().then(function(fetchedContest) {
if (contest.get("entriesCount") > contest.get("entriesLimit")) {
response.error('The contest is full.');
}
});
}).then(function() {
response.success();
}, function(error) {
response.error(error);
});
});
Любая помощь или примеры того, как использовать обещания для этого, будут высоко оценены. Ясно, что я не совсем понимаю, как они работают синтаксически.
Это будет намного проще, если вы опишете данные. Лучший способ сделать это - вставить строки заголовков из браузера данных для каждого объекта (достаточно широко, чтобы включить столбцы, на которые ссылается вопрос). – danh
Чтобы задать вопрос и ответы в каком-то контексте, вы можете прочитать ** [Как получить доступ к предыдущим результатам в цепочке .then()?] (Http://stackoverflow.com/questions/ 28250680 /) **. Исходный код вопроса записывается в ** [Nesting (and) closures] (http://stackoverflow.com/a/28250687/3478010) ** стиле, в то время как попытка очистить не соответствует ни одному из предложенных узоры. Оба ответа ниже: ** [Mutable Contextual State] (http://stackoverflow.com/a/28250700/3478010) **, который по указанным причинам действительно следует избегать. –
Лично я бы либо придерживался оригинального вложенного решения, либо принял ** [Break the chain] (http://stackoverflow.com/a/28250704/3478010) **, в котором после нескольких строк преамбулы вы закончит с простой структурой управления формы 'Parse.Promise.when (p1, p2, p3). then (function (r1, r2, r3) {...}), затем (...);' , Я думаю, это примерно так же аккуратно, как вы могли это сделать. Если вы все еще заинтересованы, я отправлю полный ответ. –