6

Yinelemeli bir parametre ile bir işlev çağıran bir JQuery'nin .each döngüsüne sahibim, bu işlev çağrısını geciktirmenin bir yolu var mı? SetTimeout'u aşağıdaki gibi denedim ancak bu işlev hemen çalıştırılırken çalışmaz.Gecikme JavaScript işlev yürütme

$.each(myArray, function (j, dataitem) 
{ 
    setTimeout(function() { showDetails(dataitem) }, 300); 
}); 

function showDetails(dataitem) 
{ 
... 
} 

Aralık boyutu kabaca 20, ben yapmaya çalışıyorum ne yerine hemen belli bir zaman dilimi içinde aramaları fonksiyonu dağıtmak olduğunu, bir fikrin nasıl bunu başarmak için? Fonksiyonların nasıl yapıldığını görmek için yeniden yazmayı ve yeniden yapılandırmayı hazırlıyorum, herhangi bir yardım takdir edilecektir.

+3

yürütme kesinlikle ertelenir . Ancak döngü değildir, yani tüm 20 'setTimout'lar bir kerede az çok çağrılır. ShowDetail işlevlerini birbiri ardına çağırmak ister misiniz? Yani, ilk 300ms sonra, ikinci 600ms sonra, vb –

cevap

9

dinamik aralığını hesaplamak için dizinin endeksi kullanabilirsiniz: Sadece $.each kullanmayın

$.each(myArray, function (j, dataitem) { 
    window.setTimeout(function() { 
     showDetails(dataitem) 
    }, (j + 1) * 300); 
}); 
+0

Soruyu tekrar okudum, bu, askerin ne yapmaya çalıştığı sorusuna benziyor. +1 –

+1

'window.' öneki gerçekten gerekli mi? Kimsenin setTimeout ismini gölgede bırakacağını düşünmüyorum. –

+0

@ Šime Vidas, Her zaman uygun kapsam belirleme kullanmayı tercih ederim. Bu sadece iyi bir uygulama. –

2

Bunları, 300 milisaniyeden sonra tümyürütürsünüz.

window.setTimeout(function() { showDetails(dataitem) }, (j + 1) * 300); 

Düzenleme:: Bunun yerine, böyle bir şey denemek yerine yine de yapmaya birer birer yapmaya daha iyi olduğunu düşünüyorum seferde 20 zamanlayıcılar oluşturma. Fonksiyon olmalıdır:

function showDetails(index) 
{ 
    if (index >= myArray.length) 
     return false; 
    var dataItem = myArray[index]; 
    //code here...... 
    //code here...... 
    //code here...... 
    windows.setTimeout(function() { showDetails(index + 1); }, 300); 
} 

Ve ilk çağrı olabilir:

$(document).ready(function() { 
{ 
    showDetails(0); 
}); 

Bu myArray düz küresel dizidir varsayalım ve bir öğe işlemek ve ancak o zaman gecikmeyle sonraki öğeyi arayacak.

+0

Teşekkür ederim, ben bunu denedim ve işe yarıyor, ben ilk cevabı seçtim ama benim için daha kolay okumak için kod. +1 :) – Maya

+0

@Maya şerefsiz, sizin için çalıştığına sevindim. :-) –

2

jQuery.queue([ queueName ], callback(next))'a bakın. Bu, çağrılacak işlevleri sıraya sokmanıza ve jQuery'nin animasyon efektlerinin dahili olarak kullanılmasına izin verir.

Bir kuyruğu uygulamak istediğiniz gibi geliyor, ancak bunu yapmak için niyetiniz net değil.

DÜZENLEME: yeniden okuma soru, ancak ben sana özel bir kuyruğa sahip gecikmeli fonksiyon icra ulaşmak için nasıl bir örnek göstermek düşündüm, diğer cevaplar daha sonra ne eşleştiğini düşünüyoruz.

.

var myArray = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20], 
    output = $('#output'); 

// set the queue up 
$.each(myArray, function (j, dataitem) { 
    output.queue('queue', function(next) { 
     var that = this; 
     showDetails(dataitem); 
     window.setTimeout(next,300); 
    }); 
}); 

// start the queue running. 
output.dequeue('queue'); 

function showDetails(dataitem) { 
    output.append('<div>' + dataitem + '</div>'); 
} 
+0

Bu aslında bilmek için yararlıdır. +1 :) – Maya

0

, ama bir şey gibi:

var data = [1, 2, 3, 4, 5]; 

function showDetails(values, delay) { 
    console.log(values.shift()); //show the value 
    if (values.length) { 
    setTimeout(function() {showDetails(values, delay); }, delay); //schedule next elem 
    } 
} 

showDetails(data.slice(0), 300); //dont forget the slice, call-by-reference