Насколько мне известно, еще нет встроенной поддержки увеличения свойств для каждого нового документа. Однако вы можете добиться этого самостоятельно для документов, имеющих только одно свойство приращения (или если все свойства приращения могут быть выведены из одного свойства приращения).
Метод
Для этого мы используем тот факт, что при создании нового документа вы можете установить _id
вместо того, чтобы позволить Sanity сгенерировать его для вас. Если вы попытаетесь создать документ с _id
, который уже используется для другого документа, запрос завершится ошибкой. Мы используем это как механизм защиты от условий гонки.
Для рассматриваемого варианта использования нам нужно сделать три вещи:
- Получите
deliveryNumber
последнего созданного заказа (см. этот ответ)
- Увеличивайте на единицу, чтобы получить следующий
deliveryNumber
- Создайте новый заказ с тем же значением для
_id
и deliveryNumber
Если два заказа размещаются одновременно, так что есть попытка создать два заказа с одним и тем же deliveryNumber
, последний запрос, обработанный Sanity, завершится ошибкой, потому что он имеет тот же _id
, что и первый. Пока это не сработает, каждый заказ должен иметь уникальный deliveryNumber
на единицу выше предыдущего.
Когда это не удается
Если заказы создаются в результате взаимодействия с пользователем, я предлагаю сообщить пользователю, что это не удалось, и попросить его повторить попытку. Это будет происходить не часто, и почти наверняка не дважды подряд.
Если, однако, вы должны программно убедиться, что вы попробуете еще раз, пока не добьетесь успеха, я предлагаю отложить случайное количество времени (которое увеличивается экспоненциально каждый раз при неудаче), прежде чем пытаться снова.
Жизнеспособность
Чем чаще создаются заказы, тем менее жизнеспособно это решение. Я полагаю, что для большинства систем это вообще маловероятно.
person
ArneHugo
schedule
03.05.2018