• Как выполнить запрос в базу на ajax?

    @bromzh
    Drugs-driven development
    Задержку по времени в синхронном коде вставлять нельзя. будет тормозить всё приложение (оно же однопоточное). Делай задержку в асинхронном режиме. Тебе надо написать функцию, которая будет выполнять запрос и проверять, заполнилась ли переменная нужным значением. Если да - то возвращай его, если нет - делай задержку и повторяй. ПХП я не знаю (и как там работать с корутинами тоже). Ты сам почитай, например, вот это. Я приведу пример, как это можно сделать на питоне с пояснениями, на ПХП сам перепиши. Итак:
    import asyncio  # модуль, который позволяет работать в асинхронном режиме
    import random
    
    # "сообщаем", что функция получения данных будет исполняться как сопрограмма
    @asyncio.coroutine
    def fetch_data():
        data = 0
        # Для примера, будем запрашивать данные, пока не выпадет 6-ка.
        # в реале, вместо получения рандома, ты должен делать запрос к БД
        while not data == 6: 
            print(data)
            data = random.randint(0, 10)  # вот тут делай запрос к БД и заполняй твою переменную
            yield from asyncio.sleep(3.0)  # асинхронная задержка, она не будет блокировать приложение
        return data  # когда вышли из цикла, в переменной data будет только нужная инфа
    
    # эта функция тоже будет исполняться как сопрограмма. без этого декоратора невозможно получать асинхронно данные через yield from
    @asyncio.coroutine
    def test():
        # получаем данные асинхронно
        # переменная data заполнится только тогда, когда в функции fetch_data выпадет 6,
        # она выйдет из цикла и вернёт значение
        data = yield from fetch_data()
        print('Bingo!', data)
        loop.stop()  # когда получили данные, останавливаем асинхронный цикл
        # ты не должен останавливать, чтобы каждый раз не запускать цикл при получении данных
        # ты должен просто вернуть данные клиенту    
        
    if __name__ == '__main__':
        loop = asyncio.get_event_loop()  # создаём цикл
        asyncio.async(test())  # асинхронно запускаем функцию
        # тебе это надо делать при каждом запросе на какой-то УРЛ
        # По-сути, в обработчике УРЛ ты должен просто вызывать функцию test, 
        # а она уже отошлёт данные клиенту
        loop.run_forever()  # запускаем бесконечный асинхронный цикл
        loop.close()  
        # если он завершится (у меня он завершается, когда получена 6-ка), надо закрыть цикл


    Ну или вариант попроще, на клиенте создай функцию, которая будет отправлять AJAX-запрос к серверу и ставь таймер в 3 секунды. Когда вернётся непустое значение, тормози таймер.
    Ответ написан
    Комментировать