С помощью JS fetch-PUT я обновляю свою базу данных (и это действительно так), но при fetch-GET данные отображаются непосредственно перед обновлением.
Я работаю над проектом Django типа сети. У меня есть JS код, в котором с помощью fetch-PUT я обновляю свою базу данных и могу проверить из файла, что она обновлена.
function update_like(identity) {
fetch('/like',{
method: 'PUT',
body: JSON.stringify({
id: identity,
})
},
show(identity)
)
};
Затем с помощью fetch-GET я пытаюсь получить данные
function show(identity) {
fetch('/like', {
headers: {
'Cache-Control': 'no-cache'
}
})
.then(response => response.json())
.then(likedic => {
console.log(likedic);
if (likedic[identity]){
document.getElementById(`arithmos${identity}`).innerHTML = ` ${likedic[identity].length}`;
} else {
document.getElementById(`arithmos${identity}`).innerHTML =' 0';
}
});
}
дело в том, что каждый раз отображаются данные из предыдущей обновленной базы данных.
То есть, когда я первый раз запускаю функцию update_like, функция show отображает базу данных в том виде, в котором она была до запуска функции update_like. Но я вижу из файла, что база данных обновлена.
Второй раз, когда я запускаю функцию update_like, функция show отображает базу данных так, как это должно быть в первый раз, даже если я снова вижу из файла, что база данных обновлена и т.д.
Я полагаю, что у него недостаточно времени для чтения базы данных обновлений. Я перепробовал много всего, но не могу заставить его работать. Ниже приведена моя функция python
def like(request):
likedic = {}
if request.method == 'GET':
allcomments = Like.objects.all()
for i in range(len(allcomments)):
if allcomments[i].comment.id not in likedic.keys():
likedic[allcomments[i].comment.id] = []
likedic[allcomments[i].comment.id].append(allcomments[i].user.username)
print('likedic',likedic)
else:
likedic[allcomments[i].comment.id].append(allcomments[i].user.username)
return JsonResponse(likedic, safe=False)
elif request.method == "PUT":
data = json.loads(request.body)
Likes = Like.objects.filter(comment = Comment.objects.get(id = data['id']), user = User.objects.get(username = request.user.username))
if Likes:
Likes.delete()
else:
Likes = Like(comment = Comment.objects.get(id = data['id']), user = User.objects.get(username = request.user.username))
Likes.save()
return HttpResponse(status=204)
# Email must be via GET or PUT
else:
return JsonResponse({
"error": "GET or PUT request required."
}, status=400)
Буду очень признателен за совет. Большое спасибо заранее.
Используйте async-функции вместо обычных функций, и дожидайтесь завершения первой функции перед выполнением второй. Например, преобразуйте update_like в асинхронную функцию.
Псевдокод:
async function update_like(identity) {
return fetch('/like',{
method: 'PUT',
body: JSON.stringify({
id: identity,
})
},
show(identity)
)
};
Позже, звоните show только после ожидания update_like:
// `await` must be used within an async fucntion
// So, I'll use await inside this immediately invoked function:
(async function()
{
let identity = "someIdentity";
await update_like(identity); // Waits until update is complete
return show(identity);
})();
Наконец-то я нашел решение! Я добавил функцию setTimeout перед вызовом функции show. Я установил 0.05 секунды и это работает! Я не знаю, правильный ли это способ или лучший, но это наконец-то работает!
function update_like(identity) {
fetch('/like',{
method: 'PUT',
body: JSON.stringify({
id: identity,
})
},
setTimeout(() => {
show(identity);
}, 50)
)
};