2013-07-12 5 views
0

Я пытаюсь приостановить скрипт в середине его выполнения, как это сделать, не вставляя его в setTimeout? Проблема в том, что это всего лишь фрагмент кода, а остальное - LOT больше, и он может запутаться, вставив его в setTimeout.Приостановка выполнения скрипта

$.ajax({ 
    type: 'POST', 
    url: rAction, 
    data: rData, 
    success: function(msg){ 

    // BEFORE PROCEEDING TO THE FOLLOWING CODE, WAIT 5 SECONDS 
    wait(5000); //? 

    $('h1').hide(); 

    $('#result').html(msg); 
    $('#alertTxt').html($('#result .system-error-message').html()); 
    $('#alert').slideDown('fast'); 
    $('#regForm').slideUp('fast'); 
    $("html, body").animate({ scrollTop: 170 }, 600); 
    $('#but_submit').show(); 
    $('#processing').hide(); 

}); 
+0

Я бы дал вашей функции успеха имя и переместил его из команды ajax. вы затем разбиваете разделы кода внутри функции на более именованные функции. вы можете легко вызвать эти подразделы друг от друга, используя setTimeout, если/при необходимости. внешняя функция предоставляет псевдо-глобальную переменную namepace, которая в сочетании с закрытием от подфункций упрощает управление состоянием через асинхронный поток без сложной вложенности, обычно связанной с обратными вызовами. – dandavis

ответ

0

Введите код, который вы хотите отложить в другой функции, затем передайте эту функцию в setTimeout. Это должно сохранить ваш «настоящий» код красивым и аккуратным.

function handleResponse() { 
    $('h1').hide(); 

    $('#result').html(msg); 
    $('#alertTxt').html($('#result .system-error-message').html()); 
    $('#alert').slideDown('fast'); 
    $('#regForm').slideUp('fast'); 
    $("html, body").animate({ scrollTop: 170 }, 600); 
    $('#but_submit').show(); 
    $('#processing').hide(); 
} 

$.ajax({ 
    type: 'POST', 
    url: rAction, 
    data: rData, 
    success: function(msg){ 

    // BEFORE PROCEEDING TO THE FOLLOWING CODE, WAIT 5 SECONDS 
    setTimeout(function() { 
    handleResponse(msg); 
    }, 5000); 
}); 
+0

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

+0

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

+0

Что вы подразумеваете под однопоточным? – Damien

0

... как я сделать это без наклеивания в SetTimeout?

Вы можете использовать web workers для долгосрочного сложного кода, в котором вы не хотите возвращаться в браузер. Этот код не может напрямую изменять DOM, но он может отправлять сообщения обратно на главный сценарий, рассказывая основному скрипту, что нужно изменить.

В браузерах, которые не поддерживают веб-работников, у вас в принципе нет выбора, кроме как вернуть (setTimeout и его двоюродных братьев).

В Интернете вы можете найти различные примеры веб-работников, но для чего это стоит, вот что я сделал for another answer here, который показывает прогресс подсчета на большое количество. Но концепция такая же: длительный скрипт работает отдельно от основного потока JavaScript и отправляет ему обновления через postMessage.

основного документа и сценария:

<!doctype html> 
<html> 
<head> 
<meta charset="UTF-8"> 
<title>Progress</title> 
<style type="text/css"> 
body, html { 
    height: 100%; 
} 
body { 
    font-family: sans-serif; 
} 
</style> 
</head> 
<body> 
<div id="progress"><em>(Click to start)</em></div> 
<script> 
(function() { 
    var div = document.getElementById("progress"); 
    var counter = new Worker("counter.js"); 

    div.addEventListener("click", run); 

    counter.addEventListener("message", function(event) { 
    div.innerHTML = "Counter so far: " + event.data.counter; 
    }); 

    function run() { 
    div.removeEventListener("click", run); 
    counter.postMessage({ max: 10000000 }); 
    } 
})(); 
</script> 
</body> 
</html> 

counter.js веб-рабочий сценарий (они всегда отдельные файлы):

self.addEventListener("message", function(event) { 
    var max; 
    var counter; 

    max = event.data && event.data.max || 100000; 
    for (counter = 0; counter < max; ++counter) { 
    if (counter % 1000 === 0) { 
     self.postMessage({counter: counter}); 
    } 
    } 
    self.postMessage({counter: counter}); 
}); 
-1

Почему бы не поставить его в функцию и вызвать эту функцию с SetTimeout (func, 5000)?

+1

Более половины текста вопроса - это * высказывание * почему бы и нет. –

+0

Я действительно не вижу разницы между помещением его в функцию $ .ajax() или в другую функцию. Не менее смущает имхо. – Tdelang

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