С помощью 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)
    )
};
Вернуться на верх