Убить процесс Javascript через определенное время - PullRequest
5 голосов
/ 19 февраля 2010

Прошу прощения, если это дубликат.

Допустим, у меня есть функция JavaScript, которая вызывает веб-сервис для извлечения некоторых данных. Я использую движущуюся графику, чтобы пользователь знал, что она работает. Когда он успешно получен, я изменяю изображение на галочку. Вот мой код:

getData: function() {
    $("#button").attr("disabled", "true");

    var params = {
        doRefresh: false,
        method: '/GetData',
        onSuccess: new this.getDataCallback(this).callback,
        onFailure: new this.getDataFailed(this).callback,
        args: { text: $("#getData").val() }
    };

        WebService.invoke(params.method, params.onSuccess, params.onFailure, params.args);

}

Мне хотелось бы, чтобы через 5 минут этот процесс все еще не возвращал мои данные успешно, чтобы вызвать исключение или, что еще лучше, запустить мою функцию this.getDataFailed (this) .callback. Кажется ли это возможным с JavaScript? Я посмотрел на setTimeout () и setInterval (), и они, похоже, просто задерживают выполнение скрипта, в то время как я хочу буквально «прервать» длительный процесс. Есть идеи?

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

Ответы [ 2 ]

5 голосов
/ 19 февраля 2010

IE8 предлагает свойство timeout и событие ontimeout. Однако они нестандартны.

Я заметил, что вы используете jQuery в некоторых из ваших примеров кода. jQuery также поддерживает свойство timeout для его метода ajax(), который будет выполнять обратный вызов error после того, как будет превышен предел времени ожидания. Вы можете использовать метод $.ajaxSetup(), чтобы объявить время ожидания перед выполнением любых вызовов ajax:

$.ajaxSetup({
    timeout: 300000
});

Если вы не используете jQuery для выполнения запросов, вы можете указать свой собственный код тайм-аута:

var xhrTimeout;
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://blah.com/etc", true);
xhr.onreadystatechange = function ()
{
    if (xhr.readyState == 4)
        window.clearTimeout(xhrTimeout);
}
xhr.send();
xhrTimeout = window.setTimeout(function ()
{
    xhr.abort();
    failFunction();
}, 300000); // 5 mins
3 голосов
/ 19 февраля 2010

То, как я бы это сделал, выглядело бы так ( очень грубый псевдокод):

InvokeWebService
setTimeout

onTimeout:
    cancelInvokation
    DoOtherStuff

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