2013-11-22 1 views
1

У меня возникли проблемы со следующим javascript. Я использую структуру jQuery.Сложность с обещаниями javascript и setInterval

Этот код работает в первый раз, отображая дату, температуру и влажность, но во второй раз я получаю это сообщение об ошибке;

Uncaught SyntaxError: Неожиданный идентификатор

Вот код;

var gettingTemperature = $.post("/get_temperature.php"); 

setInterval(gettingTemperature, 5000); 

gettingTemperature.then(function (data) { 

     $('#date').text(data.date); 
     $('#temperature').html(data.temperature + "℃"); 
     $('#humidity').text(data.humidity + "%"); 

    }, function() { 
     console.log('Unable to access temperature model'); 
    } 
); 
+0

У меня был christiandev, я не мог найти проблему. –

ответ

4

gettingTemperature не представляет вызов $ .post(), а скорее результат вызова $ .post(), который является объектом jqXHR

setInterval ожидает, что функция ссылка в качестве первого параметра, но вы передаете объект jqXHR. Вот почему вы бежите $ .post() один раз (с самой первой строки) и setInterval не удается

var gettingTemperature = function { 
    $.post("/get_temperature.php").then(function (data) { 

     $('#date').text(data.date); 
     $('#temperature').html(data.temperature + "℃"); 
     $('#humidity').text(data.humidity + "%"); 
    }, function() { 
     console.log('Unable to access temperature model'); 
    }); 
}; 

gettingTemperature(); 
setInterval(gettingTemperature, 5000); 
+0

Является ли ** getTemperature ** обещанием? Я научил, что могу создать обещание из вызова ajax, а затем запустить его несколько раз. –

+0

Обещать невозможно. И да, jqXHR реализует интерфейс Promise и (следовательно) «является» обещанием – devnull69

+0

Благодарим за помощь. –

1

Вы должны пройти метод в setInterval, но вы передаете обещание. Обычно в этом сценарии вы просто передаете функцию успеха или отказа в вызов $.post, но если вам действительно нужно использовать обещание, то это тоже хорошо. Поскольку вы точно не знаете, когда вернется вызов $.post (т. Е. Сколько времени это займет), вы не должны использовать setInterval, потому что, если это занимает больше времени, вы можете получить несколько параллельных запросов, и не очень полезно.

Что большинство людей в этом сценарии ждать, пока первые $.post запросы не заканчивается, то в complete обработчик, вызовите $.post снова. Таким образом, вы будете получать только один запрос одновременно.

+0

Благодарим за помощь. –

+0

Я не хочу наводнять мой сервер запросами. Как я получу полный обработчик, чтобы подождать некоторое время, прежде чем снова вызвать $ .post? –

+0

Используйте 'setTimeout'. Он похож на функцию 'setInterval', но только выполняет предоставленную функцию один раз. –

 Смежные вопросы

  • Нет связанных вопросов^_^