Я знаю, что уже задавал много разных вопросов о моем случае, но я не нахожу в Google примеров, похожих на мой случай: (* 1001 *
И это моя первая попытка использовать firebase (и вообще базы данных javascript и nosql), так что на данный момент транзакция представляет для меня большую боль.
Итак, мой вопрос:
это хорошая практика вообще и если да каков правильный разрыв транзакции с различными состояниями ошибок / сообщениями для разных ситуаций?
У меня транзакция, проходящая через запись «предложение» с резервированием «мест»:
Я хочу прервать его, если выполняется одно из следующих 3 условий и вернуть состояние / сообщение функции вызывающей стороны .
- если запрашивающий пользователь уже зарезервировал места для этого предложения.
- если мест не хватает.
- если это предложение не существует.
И если все в порядке, транзакция должна завершиться нормально и вернуть состояние / сообщение функции вызывающей стороны, что резервирование выполнено.
Я не уверен, как прервать транзакцию в случае выполнения одного из условий.
- если я использую , генерируем новую ошибку ('описание проблемы.') , тогда это будет Исключение , и оно не обрабатывается обработчиком catch () транзакции Promise
и я не уверен, как обработать это исключение, потому что это асинхронная функция здесь.
так что я думаю, что я не должен использовать исключение.
Вот что я имею в виду:
dealSeats = function(entryRef, data) {
const TAG = '[dealSeats]: ';
return entryRef.transaction((entry)=>{
if (entry) {
if ((entry.deals) && (entry.deals[data.uid])) {
**? how to break the transaction with state/message 'You already have a deal.' ? and how to handle it below ?**
} else if (entry.details.seatsCount >= data.details.seatsCount) {
entry.details.seatsCount -= data.details.seatsCount;
var deal = [];
deal.status = 'asked';
deal.details = data.details;
if (!entry.deals) {
entry.deals = {};
}
entry.deals[data.uid] = deal;
} else {
**? how to break the transaction with state/message 'Not enought seats.' ? and how to handle it below ?**
}
}
return entry;
**? how to check if 'entry' is really null ? i.e. offer does not exists ?** and break and handle it.
})
.then((success)=>{
return success.snapshot.val();
})
.catch((error)=>{
return Promise.reject(error);
});
}
вот мои данные в базе данных в реальном времени:
activeOffers
-LKohyZ58cnzn0vCnt9p
details
direction: "city"
seatsCount: 2
timeToGo: 5
uid: "-ABSIFJ0vCnt9p8387a" ---- offering user
вот мои тестовые данные, отправленные почтальоном:
{
"data":
{
"uid": "-FGKKSDFGK12387sddd", ---- the requesting/asking user
"id": "-LKpCACQlL25XTWJ0OV_",
"details":
{
"direction": "city",
"seatsCount": 1,
"timeToGo": 5
}
}
}
==== обновлено с окончательным источником ====
большое спасибо Renaud Tarnec!
Итак, вот мой последний источник, который работает нормально. Если кто-то видит потенциальную проблему, пожалуйста, дайте мне знать. Спасибо.
dealSeats = function(entryRef, data) {
const TAG = '[dealSeats]: ';
var abortReason;
return entryRef.transaction((entry)=>{
if (entry) {
if ((entry.deals) && (entry.deals[data.uid])) {
abortReason = 'You already made a reservation';
return; // abort transaction
} else if (entry.details.seatsCount >= data.details.seatsCount) {
entry.details.seatsCount -= data.details.seatsCount;
var deal = [];
deal.status = 'asked';
deal.details = data.details;
if (!entry.deals) {
entry.deals = {};
}
entry.deals[data.uid] = deal;
// Reservation is made
} else {
abortReason = 'Not enought seats';
return; // abort transaction
}
}
return entry;
})
.then((result)=>{ // resolved
if (!result.committed) { // aborted
return abortReason;
} else {
let value = result.snapshot.val();
if (value) {
return value;
} else {
return 'Offer does not exists';
}
}
})
.catch((reason)=>{ // rejected
return Promise.reject(reason);
});
}
Единственная проблема - предупреждение во время развертывания в терминале VSCode об этом прерывании, не возвращая значения:
warning Arrow function expected no return value consistent-return
В настоящее время я не уверен, что смогу что-нибудь с этим сделать.