тайм-аут для функции (jQuery) - PullRequest
2 голосов
/ 09 марта 2011
function getNames(){
    // some code
}

Эта функция может быть выполнена за одну секунду, но иногда она останавливается и блокирует html на странице (внутри ajax) на бесконечное время.

Я хотел бы иметь ограничение по времени для этой функции. Если он не закончится через десять секунд, прервите его.

Как это сделать?

Ответы [ 3 ]

3 голосов
/ 09 марта 2011

Это действительно легко с отсроченными обещаниями jQuery 1.5 .

В следующем примере создается Deferred и для двух функций на основе таймера устанавливается resol отклонить Отложено после случайного интервала.В зависимости от того, кто выстрелит первым, «выигрывает» и вызывает один из обратных вызовов.Второй тайм-аут не действует, так как Отложенный уже завершен (в разрешенном или отклоненном состоянии) с первого действия тайм-аута.

// Create a Deferred and return its Promise
function asyncEvent() {
    var dfd = new jQuery.Deferred();
    setTimeout(function() {
        dfd.resolve('hurray');
    }, Math.floor(Math.random() * 1500));
    setTimeout(function() {
        dfd.reject('sorry');
    }, Math.floor(Math.random() * 1500));
    return dfd.promise();
}

// Attach a done and fail handler for the asyncEvent
$.when( asyncEvent() ).then(
    function(status) {
        alert( status + ', things are going well' );
    },
    function(status) {
        alert( status + ', you fail this time' );
    }
);

Вы можете легко изменить этот пример, чтобы удовлетворить ваши потребности:1013 *

2 голосов
/ 09 марта 2011

Если это сама функция, которая отключается, просто установите таймер и либо return, либо throw, если он превышает ваш максимальный период времени.

Если, с другой стороны, если задержка вызвана тем, что запрос AJAX не возвращается, и вы используете $.ajax(), вы всегда можете установить настройку timeout. Это должно убить запрос. Обратите внимание, что вам следует избегать использования обратного вызова success, поскольку он вызывается только в случае успешного выполнения запроса. Вместо этого используйте complete callback для отслеживания сбоев. Он сообщит вам, если произошла ошибка. Согласно документации, это доступно в версии 1.4. Я не уверен насчет pre-1.4, но думаю, что он работал и в 1.3.

0 голосов
/ 09 марта 2011

Как предложено выше, вы можете использовать Web Workers, если // какой-то код иногда занимает много времени (например, ожидание большого количества информации с медленного сервера).Это позволит фоновую обработку без блокировки главной страницы.Обратите внимание, что еще не все браузеры поддерживают его.

Хорошее введение можно найти здесь .

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