2010-06-02 2 views
1

Я хочу, чтобы цикл через объект, который содержит функции, которые будут выполняться один за другим. Моим самым идеальным подходом было бы иметь такую ​​цепочку как-то (то есть func2 ждет func1 и func3 ждет func2), но это должно произойти динамически, и все функции будут иметь разные длительности.Вызов нескольких функций последовательно с jquery

Я использую jQuery, поэтому я подумал, что, возможно, «queue()» может помочь, но я не очень много работал с ним.

A main concern не должен добавлять никаких областей/обратных вызовов к функциям внутри объекта. Я бы предпочел каким-то образом заключить их в родительскую функцию для выполнения в цикле, чтобы создать обратный вызов/цепочку.

Вот пример того, что у меня есть сейчас, но ошарашен. Спасибо за любую помощь!

var obj = [ 
{'name':'func1','callback':function(){ alert(1); }}, 
{'name':'func2','callback':function(){ alert(2); }}, 
{'name':'func3','callback':function(){ alert(3); }} 
]; 

$.each(obj, function(x, el) { 
    el.callback(); 
}); 
+0

Я не следую. Правильно ли введен «obj», или он неправильно структурирован? Что именно не так с вышеуказанным кодом (кроме того, что три функции тривиальны)? –

+0

Проблема в том, что функции выполняются асинхронно, а не один за другим. Я также не буду знать, сколько функций находится внутри объекта, поэтому я не хочу/не могу статически связать их вместе. – darcy

+0

Нет, они этого не делают. В приведенном выше коде они гарантированы в порядке. –

ответ

1

Попробуйте это:

var obj = [ 
    function() { alert(1); }, 
    function() { alert(2); }, 
    function() { alert(3); } 
]; 
$.each(obj,function() { 
    // Replace 500 with whatever you want 
    setTimeout(this,500); 
}); 

Вы также можете использовать for цикл, так как нет никакой причины использовать $.each, хотя это не проблема:

for (var i = 0; i < obj.length; i++) { 
    // Replace 500 with whatever you want 
    setTimeout(this[i],500); 
} 

Это также зависит от хотите ли вы иметь разные сроки, основываясь на том, какую функцию вы выполняете.

Вот для for цикла:

for (var i = 0; i < obj.length; i++) { 
    // Replace 500 with whatever you want 
    setTimeout(this[i],500 * i); 
} 

И $.each:

$.each(obj,function(i) { 
    // Replace 500 with whatever you want 
    setTimeout(this,500 * i); 
});