6

मेरे पास एक JQuery है। प्रत्येक लूप जो प्रति फ़ंक्शन प्रति पैरामीटर के साथ फ़ंक्शन को कॉल करता है, क्या इस फ़ंक्शन कॉल में देरी करने का कोई तरीका है? मैंने setTimeout को निम्न में से आजमाया है लेकिन यह काम नहीं करता है क्योंकि फ़ंक्शन तुरंत निष्पादित हो जाता है।विलंब जावास्क्रिप्ट के फ़ंक्शन निष्पादन

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

function showDetails(dataitem) 
{ 
... 
} 

सरणी का आकार लगभग 20, मुझे क्या करना कोशिश कर रहा हूँ तुरंत के बजाय एक निश्चित समय सीमा से अधिक कॉल समारोह वितरित करने के लिए है, किसी भी विचार कैसे इस लक्ष्य को हासिल करने के लिए? मैं इसे फिर से लिखने और पुन: व्यवस्थित करने के लिए तैयार हूं कि इसे पूरा करने के लिए कार्यों को कैसे बुलाया जाए, किसी भी मदद की सराहना की जाएगी।

+3

निष्पादन निश्चित रूप से स्थगित कर रहा है । लेकिन लूप नहीं है, यानी सभी 20 'सेटटाइमआउट एक बार में कम से कम बुलाए जाते हैं। क्या आप 'showDetail' फ़ंक्शन एक दूसरे के बाद कॉल करना चाहते हैं? मेरा मतलब है, 300ms के बाद पहला, 600ms के बाद दूसरा, आदि –

उत्तर

9

आप सरणी के सूचकांक इस्तेमाल कर सकते हैं अंतराल गतिशील गणना करने के लिए: कुछ की तरह

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

अब जब मैंने प्रश्न दोबारा पढ़ लिया है, तो ऐसा लगता है कि सवाल पूछने वाला क्या करने की कोशिश कर रहा है। +1 –

+1

क्या 'window.' उपसर्ग वास्तव में आवश्यक है? मुझे नहीं लगता कि कोई भी कभी भी 'सेटटाइमआउट' नाम को ढंक देगा। –

+0

@ ime विदा, मैं हमेशा उचित स्कोपिंग का उपयोग करना पसंद करता हूं। यह सिर्फ अच्छा अभ्यास है। –

2

आप 300 मिलीसेकंड के बाद सभी निष्पादित करते हैं।

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

संपादित करें:: इसके बजाय, कुछ इस तरह की कोशिश के बजाय एक ही बार में मुझे लगता है कि यह एक के बाद एक ऐसा करने के लिए बेहतर है 20 टाइमर बनाने की। समारोह होना चाहिए:

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); 
} 

और पहली कॉल किया जा सकता है:

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

यह मान myArray सादा वैश्विक सरणी है, और एक आइटम संभाल और उसके बाद ही देरी से अगले आइटम कॉल करेंगे।

+0

धन्यवाद, मैंने कोशिश की है और यह काम करता है, मैंने पहला जवाब चुना है, हालांकि कोड में पढ़ने के लिए मेरे लिए यह आसान है। +1 :) – Maya

+0

@ माया चीयर्स, खुशी है कि यह आपके लिए काम कर रहा है। :-) –

2

jQuery.queue([ queueName ], callback(next)) पर एक नज़र डालें। यह आपको बुलाए जाने वाले कार्यों को कतारबद्ध करने की अनुमति देता है और यह है कि jQuery के एनीमेशन प्रभाव आंतरिक रूप से उपयोग करते हैं।

ऐसा लगता है कि आप एक कतार को कार्यान्वित करना चाहते हैं, हालांकि यह ऐसा करने के इरादे से पूरी तरह से स्पष्ट नहीं है।

संपादित करें: फिर से पढ़ने अपने प्रश्न, मुझे लगता है कि अन्य उत्तर बेहतर मेल खा के बाद कर रहे हैं, फिर भी मैंने सोचा था कि मैं तुम्हें कैसे एक कस्टम कतार के साथ देरी समारोह निष्पादन को प्राप्त करने का एक उदाहरण दिखा सकती है।

एक example of how you could use a queue

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

यह वास्तव में जानना उपयोगी है। +1 :) – Maya

0

बस $.each का उपयोग नहीं करते हैं, लेकिन:

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 
संबंधित मुद्दे