Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Цепочка вызовов с таймаутом. (https://javascript.ru/forum/misc/14558-cepochka-vyzovov-s-tajjmautom.html)

Jurasmi 21.01.2011 11:45

Цепочка вызовов с таймаутом.
 
Господа, можно ли сделать вот такую красивость:
formObj.config(par).show();

Эта штука настраивает форму и показывает её на страничке. Хитрость в том, что при "настройке" (config()) объект формы (formObj) лезет на сервер и заполняет эту самую форму. Так вот, надо "проявлять" форму только после того, как форма будет заполнена (т.е. не сразу).
Я попытался сделать вот так (не получилось):
form.config(id).show();
form = {
	config: function(par){
		//тут форма заполняеться (с привлечением AJAX)		
		setTimeout('return this', 2000);	//сейчас это "задержка", но можно сделать и callback от AJAX
	}
	show: function(){...}	//проявляет форму
	...
}

Как делаються подобные вещи "по-человечески", если делаються, конечно?

Sweet 21.01.2011 12:36

Сделать, конечно, можно (есть ли смысл заморачиваться - вопрос отдельный). Например, можно складывать вызовы в стек и звать "по готовности":
<div id="toLog"></div>
<script type="text/javascript">
var Constructor = function(){
  var stack = [];
  
  this.add = function(str){
    stack.push(str);
    if(stack.length === 1){
      document.getElementById('toLog').innerHTML += stack[0];
      setTimeout(function(){
        stack.shift();
        if(stack.length === 0) return;
        document.getElementById('toLog').innerHTML += stack[0];
        setTimeout(arguments.callee, 500);
      }, 500);
    };
    return this;
  };
};

var inst = new Constructor();
inst.add('Tra').add(' - la').add(' - la!!!');
</script>

Jurasmi 21.01.2011 12:54

Наворотил; хотя и не блеск, но работает:
form.config(id).show();

form = {
	editId: null,
	
	config: function(id){
		this.editId = id;
		return this;
	},
	
	//фиктивный метод, он выставлен наружу
	//на самом деле форма "проявляеться" методом "showInner"
	show: function(){
		this.fill(this.editId, this.showInner);
	},	

	fill: function(id, fn){
		//тут АЯКС и всё такое
		fn();	//вызываеться внутри колбека из АЯКСА
	},
	
	showInner: function(){...}
}

Jurasmi 21.01.2011 12:59

@Sweet: спасибо огромное, не знал я такого способа!
у-у-у, хитрое решение...

x-yuri 22.01.2011 12:28

Цитата:

Сообщение от Sweet
есть ли смысл заморачиваться - вопрос отдельный

отнюдь, есть смысл не заморачиваться: о разметке знают и клиент и сервер + unobtrusive javascript ;)

Jurasmi 24.01.2011 10:41

Цитата:

о разметке знают и клиент и сервер + unobtrusive javascript
что-то я ничего не понимаю :(
Что знает о разметке сервер?
Что вы хотели вообще сказать вашей фразой я не понял - очень сложно.

x-yuri 24.01.2011 12:27

я хотел сказать, что не надо отправлять html в ajax-запросы, что надо делать "по-человечески"

Jurasmi 24.01.2011 12:33

Цитата:

я хотел сказать, что не надо отправлять html в ajax-запросы
согласен, не надо. Я и не отправляю - если это камень в мой огород. :)
А, кажется я понял: "form" это не имя формы из DOM, это я так (неудачно?) назвал JS-объект (он просто отражает саму форму со странички).

x-yuri 24.01.2011 13:47

просто если ты подробнее расскажешь, чего ты пытаешься добиться, можно попытаться найти решение получше ;)

Jurasmi 24.01.2011 14:46

У меня была конкретная задача - сделать заполнение формы на сайте. Т.е. я жму кнопочку, на сервер лезет запрос, возвращает данные, которые подставляються в HTML-форму и у же только потом эта форма появляеться на страничке (заполненная как надо).
Но спрашивал я не про это, мне хотелось знать, более абстрактно, как делаються "цепочки вызовов" с "отсрочкой" - вот об этом я и спросил.


Часовой пояс GMT +3, время: 13:52.