2013-01-23 9 views
7

मैं केवल अपनी जावास्क्रिप्ट को एक बार चलाने के लिए चाहता हूं, लेकिन मैं नियंत्रित नहीं कर सकता कि जावास्क्रिप्ट फ़ाइल कितनी बार निष्पादित की जाती है। असल में मैं एक छोटे जेएस स्निपेट को एक सीएमएस में लिख रहा हूं, और सीएमएस वास्तव में इसे 5-10 बार बुला रहा है। तो इस तरह समाधान:जावास्क्रिप्ट चलने वाला कोड

function never_called_again(args) { 
    // do some stuff 
    never_called_again = function (new_args) { 
    // do nothing 
    } 
} 
never_called_again(); 

काम करने के लिए, क्योंकि जैसे ही मेरी टुकड़ा शीर्ष समारोह फिर से घोषित किया जाता है से फिर से चलाया जाता है, और 'कुछ चीजें करते' प्रतीत नहीं है फिर से मूल्यांकन है। शायद मैं इसे ठीक से नहीं कर रहा हूं, मैं जेएस के साथ अच्छा नहीं हूं। मैं एक वैश्विक चर पर कोशिश पकड़ की तरह कुछ का उपयोग कर विचार कर रहा हूँ, जैसे

if (code_happened == undefined) { 
    \\ run code 
    code_happened = true; 
} 

संपादित कुछ: एक सुसंगत राज्य जैसे नहीं है अगर मैं एक चर सेट करता हूं तो मैं देख सकता हूं कि मेरा स्निपेट फिर से चलाया जाएगा। लेकिन इसे एक्सेस करने से पहले इसे घोषित करने के लिए, मुझे नहीं पता कि 'यह चर अभी तक मौजूद है'

+1

"मैं कैसे कहने के लिए पता नहीं है 'इस चर अभी तक मौजूद है?'" - आम तौर पर यह 'var foo = window.foo || के साथ किया जाता है {} ' – zzzzBov

उत्तर

17

इस प्रयास करें:

var doneTheStuff; 
function whatever() { 
    if (!doneTheStuff) { 
    doneTheStuff = true; 
    // do the stuff 
    } 
} 

बेमानी चर घोषणाओं चर के मूल्य को प्रभावित नहीं करते। एक बार फ़ंक्शंस में से एक ने वैरिएबल को true पर सेट कर दिया है, तो अन्य कुछ भी नहीं करेंगे।

+0

काम करता है! अनुवर्ती प्रश्न - ऐसा लगता है कि अंतिम घोषित फ़ंक्शन उदा। 'सामान' करें 'अलर्ट (1)' और 'अलर्ट (2)' करें और आप केवल देखेंगे 2. मेरे लिए कोई फर्क नहीं पड़ता (वे सभी समान हैं), लेकिन किसी भी तरह से आकर्षक – Hamy

+0

@ हैमी - मेरा समाधान रिवर्स में काम करेगा। केवल पहला घोषित समारोह चलाएगा। –

+0

@ हैमी अगर कोड उसी '

2

बंद करने का उपयोग करें, और ध्वज सेट करें। झंडा true है, तो बस वापसी:

if (! window.never_called_again ) { 
    window.never_called_again = (function() { 
     var ran = false; 
     return function (args) { 
      if (ran) return; 
      ran = true; 
      // Do stuff 
     }; 
    }()); 
} 

यहाँ बेला है: http://jsfiddle.net/U2NCs/

+1

लेकिन यदि यह जावास्क्रिप्ट के दो अलग-अलग बिट्स में दिखाई देता है, तो यह वही समस्या होगी। – Pointy

+2

यदि मैं ओपी के विवरण को समझता हूं, तो फ़ंक्शन को परिभाषित करने सहित पूरी फ़ाइल को कई बार निष्पादित किया जा रहा है। यह एक वास्तविक प्रतिनिधित्व है, और इसे कई बार कहा जाता है: http://jsfiddle.net/Qn52E/। – mellamokb

+0

जैसा कि अन्य ने बताया, मैं मेलमोकब की टिप्पणी के समान हूं, इसलिए यह काम नहीं कर रहा है ;-) – Hamy

3
if (typeof code_happened === 'undefined') { 
    window.code_happened = true; 
    // Your code here. 
} 

typeof जांच तथ्य यह है कि वैश्विक घोषित नहीं किया गया है चारों ओर आप हो जाता है। आप if (!window.code_happened) भी कर सकते हैं क्योंकि संपत्ति के उपयोग को अनिर्धारित गुणों के लिए प्रतिबंधित नहीं किया गया है।

संबंधित मुद्दे