Обратный отсчет jquery с синхронным вызовом ajax

Для некоторых продуктов есть сайт ставок и таймер обратного отсчета, который должен рассчитывать оставшееся время относительно серверного времени.

Ниже приведен jQuery для обратного отсчета и обратите внимание на атрибут serverSync, который вызывает функцию ajax с именем serverTime () для получения времени сервера.

//Countdown Jquery
$(".anything").countdown("change", {
    until: $.countdown.UTCDate(0, year, month, day, hours, minutes, seconds, 0),
    format:"dHMS",
    serverSync: serverTime
});

//The ajax function that is being called by the countdown script
function serverTime() { 
    var time = null; 
    $.ajax({
        url: "serverTime.php", 
        async: false, 
        dataType: "text", 
        success: function(text) { 
            time = new Date(text); 
        }, error: function(http, message, exc) { 
            time = new Date(); 
        }
    }); 
    return time; 
}

При открытии страницы с обратным отсчетом с разных ПК обратный отсчет перестает работать как положено. Когда я удаляю async: false из функции AJAX serverTime(), обратный отсчет работает нормально, но показывает разные таймеры на разных ПК, так как это займет время ПК, а не время СЕРВЕРА.

Мне нужно решение для этого.


person Mohamad    schedule 17.06.2016    source источник
comment
Никогда не используйте синхронный A (асинхронный !!!) JAX-запрос.   -  person VisioN    schedule 17.06.2016


Ответы (1)


Я думаю, вы ищете следующее решение

//Countdown Jquery
$(".anything").countdown("change", {
    until: $.countdown.UTCDate(0, year, month, day, hours, minutes, seconds, 0),
    format:"dHMS",
    serverSync: serverTime
});

//The ajax function that is being called by the countdown script
function serverTime() {         
    var jqxhr = $.ajax({
        url: "serverTime.php", 
        async: false, 
        dataType: "text", 
        type: "GET", // or "POST"
    });

    // 'async' has to be 'false' for this to work
    var response = {valid: jqxhr.statusText,  data: jqxhr.responseText};

    if (response.valid == 'OK')
    {
        return new Date(response.data);
    }
    else
    {
        alert('not valid');
    }
}

Следует учитывать два аспекта: один сообщает Ajax о синхронном выполнении (путем установки async: false), а другой возвращает результат после проверки ответа.

Вы не упомянули какой-либо тип вызова ajax, например GET или POST. Я установил его, вызвав GET, но вы также пробовали это с помощью POST.

person Bilas Sarker    schedule 17.06.2016
comment
Вы проверяли значения response.data и правильно ли это значение? Файл serverTime.php, какой тип возвращаемых значений? Я думаю, что нет проблем с синхронизацией для получения ответа из-за jqxhr (deffer). - person Bilas Sarker; 17.06.2016
comment
response.date возвращает правильное значение. ServerTime.php содержит следующее: ‹? Php $ now = new DateTime (); echo $ now- ›формат (M j, Y H: i: s O). \ n; ? › - person Mohamad; 17.06.2016