2009-03-25 10 views
9

असल में मैं $ .holdTillFinished() विधि में किसी भी कमांड को लपेटने में सक्षम होना चाहता हूं जो निर्दिष्ट विधि/jquery एनीमेशन निष्पादित होने तक निष्पादन जारी रखने की अनुमति नहीं देगा।जावास्क्रिप्ट/jquery में निष्पादन को रोकना संभव है?

मुझे संदेह है कि यह जावास्क्रिप्ट में मुश्किल या असंभव भी हो सकता है, लेकिन मुझे आशा है कि किसी को पता चलेगा।

मैं इस बारे में नहीं सुनना चाहता हूं कि मैं एनीमेशन में कॉलबैक कैसे अपूर्ण कर सकता हूं, या इसे और कुछ भी चलाने के लिए।

मैं वास्तव में जानना चाहता हूं कि ऐसी चीज संभव है और इसके बारे में कैसे जाना है।

यदि ऐसा नहीं होता है तो अगर कोई अच्छी कतार प्लगइन के बारे में जानता है जो उपयोगकर्ता परिभाषित विधियों और एनिमेशन दोनों को कतार में सक्षम करने में सक्षम है, तो यह भी अच्छा होगा। क्या मैं सच में चाहते हैं निष्पादन में देरी करने हालांकि एक तरीका है।

+0

@thirsty: आप कतार और विपंक्ति चाहते हैं, मुझे लगता है कि (पहले से ही सुझाव दिया और नीचे आप द्वारा खारिज कर दिया)। आप एनीमेशन के साथ मनमाने तरीके से कतारबद्ध कर सकते हैं और वे क्रम में निष्पादित होंगे। यदि आप यही नहीं पूछ रहे हैं तो क्या आप अपने प्रश्न को स्पष्ट कर सकते हैं कि आप क्या करने की कोशिश कर रहे हैं? – Prestaul

+0

मैंने एक कतार नहीं देखी है जो कार्यों के लिए काम करता है। क्या मेरा मतलब है अगर मैं तो कतार में तो एक समारोह है, तो एक एनीमेशन एक एनीमेशन गुजरती हैं, जबकि जो एनिमेशन के चलने के समारोह को क्रियान्वित नहीं किया जाना चाहिए है। साथ ही मैं यह निर्दिष्ट नहीं करना चाहता हूं कि फ़ंक्शन निष्पादित करने में कितना समय लगेगा। – thirsty93

+0

लेकिन वास्तव में जो मैं चाहता हूं वह एक रैपर है जो सभी जावास्क्रिप्ट को तब तक रोक देता है जब तक कि मैंने इसे पारित किए गए फ़ंक्शन/एनीमेशन को – thirsty93

उत्तर

10

मुझे लगता है इस मुश्किल या भी असंभव हो सकता है कि जावास्क्रिप्ट में

आपका संदेह सही है। एनीमेशन, उपयोगकर्ता इनपुट लूप और 'async = true' XMLHttpRequests को आगे बढ़ने के लिए ब्राउज़र पर रिटर्न कंट्रोल होना चाहिए, और जब तक फ़ंक्शन कॉल के प्रत्येक घोंसले स्तर वापस नहीं आ जाता है तब तक ब्राउज़र वापस नियंत्रण नहीं प्राप्त कर सकता है। इसका मतलब है कि आपके सभी कोड, जिसमें 'HoldTillFinished()' नामक फ़ंक्शन शामिल है, को अनदेखा करना होगा: इसलिए 'holdTillFinished()' असंभव है।

अन्य भाषाओं में फ्लो-कंट्रोल फीचर्स हैं जो आपको एक एसिंक्रोनस प्रक्रिया को प्रभावी ढंग से निष्पादित करने की अनुमति देती हैं जो कॉलर को सिंक्रोनस होने लगती है, और इसी तरह विपरीत। सबसे प्रसिद्ध threads और continuations हैं। जावास्क्रिप्ट में इन सुविधाओं का अधिकार नहीं है, इसलिए आप सबसे अच्छा कर सकते हैं टाइमआउट और कॉलबैक।

(बंद करने में संलग्न कार्य के चरों तक पहुंच प्राप्त करने के लिए एक इनलाइन फ़ंक्शन के रूप में कॉलबैक को परिभाषित करना कम से कम कुछ दर्द दूर करता है; कुछ अन्य भाषाओं को किसी ऑब्जेक्ट में संलग्न स्थिति के प्रत्येक बिट को लपेटना शुरू करना होता है इसे प्राप्त करने के लिए गुण।)

+0

ये अन्य भाषाएं क्या हैं? जिज्ञासु ... –

+0

खैर काफी सभी आधुनिक (गैर ब्राउज़र) भाषाओं आप सूत्र, ओएस समर्थन का उपयोग कर दे। (। जैसे stackless अजगर) निरंतरता/coroutines कम से कम हास्केल, एमएल और योजना और अन्य भाषाओं के लिए कुछ एक्सटेंशन में पाया जा सकता है; सी में प्राइमेटिव हैं जिनका उपयोग निरंतरता के निर्माण के लिए किया जा सकता है। – bobince

+0

बेशक, ब्राउज़र की दुनिया में, आप अटक गए हैं: जावास्क्रिप्ट के अलावा केवल वीबीस्क्रिप्ट है, और यह भी बदतर है! जावास्क्रिप्ट 1.7 (फ़ायरफ़ॉक्स 2 में) आप अजगर शैली जनरेटर, जो कि वास्तव में आप यहाँ मदद नहीं होता निरंतरता का एक सीमित रूप हैं देता है। – bobince

3

आप शायद http://docs.jquery.com/Effects/queue

लिए देख रहे हैं लेकिन आप चीजों में देरी का एक और अधिक सामान्यीकृत तरीका ढूंढ रहे हैं, तो (अब भी एनिमेशन के कार्य करने की अनुमति है, जबकि), मैंने पहले इस स्निपेट का उपयोग किया है (मैं, यह नहीं लिखा था तो सारा श्रेय मूल लेखक को जाता है):

//Simple wrapper enabling setTimout within chained functions. 
$.fn.wait = function(time, type) { 
    time = time || 1000; 
    type = type || "fx"; 
    return this.queue(type, function() { 
    var self = this; 
    setTimeout(function() { 
     $(self).dequeue(); 
    }, time); 
    }); 
}; 
+0

हल नहीं किया है, यह फ़ंक्शन समाप्त होने तक निष्पादन में देरी नहीं करता है। क्या करता है कुछ समय सीमा है कि मैं स्थापित करने हूँ द्वारा कतार में देरी निष्पादन है। मुझे नहीं पता कि किसी दिए गए फ़ंक्शन को चलाने में कितना समय लगता है और मुझे अनुमान लगाने की आवश्यकता नहीं है। – thirsty93

+0

यह तब बेहतर नहीं है जब कुछ भी नहीं। लेकिन यह वास्तव में वह नहीं है जिसे मैं ढूंढ रहा हूं। – thirsty93

0

आप जो चाहते हैं उसे प्राप्त करने के लिए आप एक प्रकाशन/सब्सक्राइब आर्किटेक्चर का उपयोग कर सकते हैं। आप वास्तव में क्या हासिल करना चाहते हैं, इसके बारे में बहुत कुछ जानने के बिना, मेरा अनुमान है कि यह आपके लिए काम करेगा।

इस तरह से काम करता है कि आप एक घटना के रूप में कार्य पूरा करने को देखते हैं, जिसे आप सुन सकते हैं और हैंडलर को संलग्न कर सकते हैं। Dojo has a pubsub mechanism, हालांकि मुझे यकीन है कि कुछ भी हैं।

+0

यह वही है जो मैं नहीं चाहता हूं। एक कॉलबैक जिसे मैं फ़ंक्शन/एनीमेशन में प्रश्न में पास करता हूं – thirsty93

0

यह स्थिति पर बचाव करता है लेकिन आम तौर पर जावास्क्रिप्ट में AJAX कहलाता है या कोई लूप निष्पादित होने पर प्रसंस्करण छवि को दिखाना आवश्यक है। मेरे पास एक ऐसी स्थिति है जहां मैं एक लूप में AJAX को कॉल कर रहा हूं, उपयोगकर्ता को प्रोसेसिंग छवि दिखाने के लिए दिखाया गया है। समाप्त करने के लिए मैंने एक चाल की। जब मैंने इस फ़ंक्शन को कॉल किया है तो मैंने नौकरी को रद्द करने के लिए एक बटन डाला है, मैंने एक ग्लोबल वेरिएबल सेट किया है जिसे 'cancelJob' सच में और लूप में कहा गया है, जहां मैं इस ग्लोबल को देख रहा हूं यदि यह सच है तो रन रिटर्न झूठी है और स्क्रिप्ट रुक जाएगी।

var cancelJob = false; 
foreach(){ 
    if(cancelJob == true) 
     return false; 
} 

function cancelButtonPress(){ 
    cancelJob = true; 
} 
संबंधित मुद्दे