Я приношу извинения, если это - дубликат.
Скажем, у меня есть функция 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 (этот) .callback. Это кажется выполнимым с JavaScript? Я посмотрел на setTimeout () и setInterval (), и они, кажется, просто задерживают выполнение сценария, тогда как я хочу к буквально "тайм-ауту" длительный процесс. Какие-либо идеи?
Кроме того, я открыт для любой критики / улучшения моего кода, который допускал бы эту функциональность.
IE8 предлагает свойство тайм-аута
и событие 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
Я бы сделал это следующим образом (очень грубый psuedocode):
InvokeWebService
setTimeout
onTimeout:
cancelInvokation
DoOtherStuff
onWebServiceCompletion:
cancelOnTimeout