2012-05-08 2 views
0

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

Для этого я написал «последовательную» функцию, которая принимает другую функцию, которая может быть вызвана только тогда, когда для параметра busyflag установлено значение false (т. Е. Когда другой объект функции не обрабатывается одновременно). Это мой код:

var busy = false; 
function sequential(action) { 
    while(busy) 
     setTimeout(function(){sequential(action);}, 10); 
    busy = true; 
    action(); 
    setTimeout(function(){busy = false;}, 100); 
} 

function test1() {sequential(function() {alert("test1");});} 
function test2() {sequential(function() {alert("test2");});} 

И this является примером на jsFiddle. По какой-то причине этот код этот код продолжает циклироваться во втором вызове (когда функция functioncall должна ждать).

+0

Я думаю, вы могли бы найти [deferreds] (http://api.jquery.com/category/deferred-object/) полезно ... – elclanrs

ответ

0

я первым реализовал решение, как было предложено Джеймсом Montagne, но после некоторого Searchin я узнал, что вы можете использовать onreadystatechange свойство объекта XMLHttprequest, чтобы установить флаг busy в true.

Этот код работает, как ожидалось:

function sequential(action) { 
if (busy) setTimeout(function(){sequential(action);}, 20); 
else action(); 
} 

function send(message){ 
    busy = true; 
    var request = new XMLHttpRequest(); 
    request.open("POST", "owlapi", true); 
    request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 
    request.send(message); 
    request.onreadystatechange = function() {busy = false;}; 
} 
1
while(busy) 
     setTimeout(function(){sequential(action);}, 10); 

setTimeout не блокирует, он немедленно возвращается и позволяет продолжить цикл. Javascript является однопоточным, поэтому этот цикл просто продолжает работать и предотвращает выполнение какого-либо другого кода, что означает, что занятый никогда не получит значение false для выхода из цикла.

Предполагая, что эти вещи ждут, звонки ajax, вы, скорее всего, захотите использовать какую-то очередь, а затем в обратном вызове вызова ajax запустите следующий запрос.

1

Я предполагаю, что ваш javascript делает ajax-вызовы на ваш сервер.

Если вам нужны разные вызовы для запуска один за другим, вы должны получить свой код javascript, чтобы настроить крючки, чтобы подождать, пока он не получит результаты от одного вызова до следующего запроса.

Для этих целей я рекомендую использовать набор инструментов javascript, например jQuery. Это создает проблемы, которые намного легче решить. Каждый метод ajax в jQuery принимает по крайней мере обратный вызов, который будет вызываться, когда запрос будет завершен. Для jQuery.ajax() вы можете пойти

$.ajax(...).done(function() { 
    // This part will be run when the request is complete 
}); 

И для .load():

$("#my_element").load(url,data,function() { 
    // This part will be run when the request is complete 
}); 
Смежные вопросы