Перенаправление внутри асинхронной функции
У меня есть функция для создания сессии оформления заказа Stripe.com:
@csrf_exempt
def create_checkout_session(request):
if request.method == 'GET':
domain_url = 'https://example.com/'
stripe.api_key = settings.STRIPE_SECRET_KEY
try:
order = request.user.profile.order_set.get(ordered=False)
all_in_stock = True
for orderitem in order.orderitem_set.all():
if orderitem.item.in_stock >= orderitem.quantity:
pass
else:
all_in_stock = False
break
if all_in_stock:
line_items = []
for orderitem in order.orderitem_set.all():
line_item = {
'name': orderitem.item.item_name,
'quantity': orderitem.quantity,
'currency': 'usd',
'amount': int(orderitem.item.price * 100),
}
line_items.append(line_item)
orderitem.item.in_stock -= orderitem.quantity
orderitem.item.save(update_fields=['in_stock'])
if order.shipping_address.state == 'IL':
line_item = {
'name': 'Sales tax',
'quantity': 1,
'currency': 'usd',
'amount': int(order.get_sales_tax() * 100),
}
line_items.append(line_item)
checkout_session = stripe.checkout.Session.create(
client_reference_id=request.user.profile.id,
success_url=domain_url +
'store/success?session_id={CHECKOUT_SESSION_ID}',
cancel_url=domain_url + 'store/cancelled/',
payment_method_types=['card'],
mode='payment',
line_items=line_items,
customer_email=request.user.email,
expires_at=int(time.time() + 3600),
)
return JsonResponse({'sessionId': checkout_session['id']})
else:
messages.error(request, "Not enough items in stock to fulfill the order")
return redirect("store:order-summary")
except Exception as e:
return JsonResponse({'error': str(e)})
Выполняется с помощью этого сценария:
fetch("/store/config/")
.then((result) => { return result.json(); })
.then((data) => {
const stripe = Stripe(data.publicKey);
document.querySelector("#stripeSubmitBtn").addEventListener("click", () => {
fetch("/store/create-checkout-session/")
.then((result) => { return result.json(); })
.then((data) => {
console.log(data);
return stripe.redirectToCheckout({sessionId: data.sessionId})
})
.then((res) => {
console.log(res);
});
});
});
Я хочу добавить функциональность для проверки того, что все товары все еще есть на складе, и если нет, то прервать сеанс. Я новичок в JS. Я понимаю, что простой редирект не работает, потому что функция выполняется асинхронно, но я не знаю, как сделать это правильно. Как правильно это реализовать?