5

के लिए बंद करने में पैरामीटर पास करना मैंने एक समस्या में भाग लिया है जहां मेरा ऐप आईफ्रेम में रहता है और इसे किसी बाहरी डोमेन से बुलाया जा रहा है। IE9 लोड इवेंट को फ़ायर नहीं करेगा जब iframe ठीक से लोड हो जाए तो मुझे लगता है कि मैं पृष्ठ को मतदान करने के लिए setTimeout का उपयोग करके फंस गया हूं।सेटटाइमआउट

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

App.readyIE9 = function() { 
    var timings = [1,250,500,750,1000,1500,2000,3000];  
    for(var i = 0; i < timings.length; i++) { 
    var func = function() { 
    if(App.ready_loaded) return; 
     console.log(timings[i]); 
     App.readyCallBack(); 
    }; 
    setTimeout(func,timings[i]); 
    } 
}; 

मैं LOG प्राप्त करता रहता हूं: IE9 के कंसोल में अपरिभाषित।

इसे पूरा करने के लिए उचित तरीका क्या है?

धन्यवाद

+0

इस अगर आप इस तरह के 'timing' से इतने सारे मूल्यों को हटाने के रूप में यह अधिक सामान्य बनाने के लिए, एक और भी बेहतर सवाल हो सकता है और 'ऐप' के साथ सभी लाइनें! शुरुआत में सही समाधान के लिए – cregox

उत्तर

10

ऐसा इसलिए हो रहा है क्योंकि आप अपने func में i के मान को बंद नहीं कर रहे हैं। जब लूप किया जाता है, i 8 (timings.length) है, जो सरणी में मौजूद नहीं है।

आप कुछ इस तरह करने की जरूरत है:

App.readyIE9 = function() { 
    var timings = [1,250,500,750,1000,1500,2000,3000];  
    for(var i = 0; i < timings.length; i++) { 
    var func = function(x) { 
     return function(){ 
      if(App.ready_loaded) return; 
      console.log(timings[x]); 
      App.readyCallBack(); 
     }; 
    }; 
    setTimeout(func(i),timings[i]); 
    } 
}; 
+0

+1। – VisioN

+0

धन्यवाद, यह वही है जो मैं ढूंढ रहा था। – user126715

+0

@ user321521: आपका स्वागत है :) –

10

अपने कार्य setTimeout से बुलाया जाता है जब भविष्य में कभी, i का मूल्य पहले से ही for पाश इतना console.log(timings[i]); रिपोर्ट undefined द्वारा यह की सीमा के अंत तक वृद्धि की गई है।

उस फ़ंक्शन में i का उपयोग करने के लिए, आपको इसे फ़ंक्शन क्लोजर में कैप्चर करने की आवश्यकता है। ऐसा करने के कई तरीके हैं।

App.readyIE9 = function() { 
    var timings = [1,250,500,750,1000,1500,2000,3000];  
    for(var i = 0; i < timings.length; i++) { 
    (function(index) { 
     setTimeout(function() { 
      if(App.ready_loaded) return; 
      console.log(timings[index]); 
      App.readyCallBack(); 
     }, timings[index]); 
    })(i); 
    } 
}; 

जो इस काम करता है के लिए विवरण का एक सा के रूप में:: i कि करने के लिए पहले तर्क के रूप में स्वयं को क्रियान्वित कार्य करने के लिए पारित हो जाता है मैं एक स्वयं को क्रियान्वित समारोह का उपयोग कर इस तरह i का मूल्य कब्जा करने के लिए सुझाव है कि समारोह। उस पहले तर्क को index नाम दिया गया है और स्वयं निष्पादन समारोह के प्रत्येक आमंत्रण के साथ जमा हो जाता है, इसलिए for लूप setTimeout कॉलबैक निष्पादित होने से पहले इसे बदलने का कारण नहीं बनता है। इसलिए, स्वयं निष्पादन फ़ंक्शन के अंदर index का संदर्भ प्रत्येक setTimeout कॉलबैक के लिए सरणी अनुक्रमणिका का सही मान प्राप्त करेगा।

3

यह एक सामान्य समस्या है जब आप setTimeout या setInterval कॉलबैक के साथ काम है। आप कार्य करने के लिए i मान पास करना चाहिए:

var timings = [1, 250, 500, 750, 1000, 1500, 2000, 3000], 
    func = function(i) { 
     return function() { 
      console.log(timings[i]); 
     }; 
    }; 

for (var i = 0, len = timings.length; i < len; i++) { 
    setTimeout(func(i), timings[i]); 
} 

डेमो:http://jsfiddle.net/r56wu8es/

+0

यह 'fun'' को पैरामीटर के रूप में 'i' के साथ कॉल करेगा, और इसके वापसी मान को 'setTimeout' पर पास करेगा। 'func' को फ़ंक्शन वापस करने की आवश्यकता है। –

+0

@ रॉकेट। सही। धन्यवाद, सही किया गया। – VisioN

+0

आपने इसे ठीक नहीं किया है। 'func' अभी भी 'अपरिभाषित' लौटाता है। –