2009-11-21 17 views
5

क्या कोई अन्य फ़ंक्शन पूरा होने के बाद फ़ंक्शन चलाने का कोई तरीका है? उदाहरण के लिए:jquery सिंक्रोनस फ़ंक्शंस

doSomething(); 
doSomethingElse(); 

मैं केवल DoSomething पूर्ण होने के बाद doSomethingElse() चलाना चाहते हैं। क्या यह संभव है?

+2

है नहीं क्या आप पहले से ही क्या आप चाहते हैं तैनात? मुझे यहां क्या समझ नहीं आ रहा है? -1 का सामना करने के लिए –

+1

+1। यह सवाल किसी अन्य के रूप में मान्य है। – echo

+1

कोई भी मौका आप हमें अधिक कोड दे सकते हैं या हमें बता सकते हैं कि आप क्या करने की कोशिश कर रहे हैं? – Nosredna

उत्तर

7

अपने doSomething() समारोह (जैसे कि एक Ajax अनुरोध बनाने के रूप में) कुछ अतुल्यकालिक रूप से कर रही है तो आप उस अतुल्यकालिक अनुरोध के लिए doSomethingElse() कॉलबैक बनाने के लिए, बल्कि यह doSomething() रिटर्न के बाद तुरंत अमल होने से करेंगे, तो।

+0

मैं एक AJAX अनुरोध कर रहा हूं, इसलिए यह कॉलबैक में रखने के लिए वैध समाधान की तरह दिखता है, लेकिन मैं इसे कॉलबैक के बाहर करने की कोशिश कर रहा था। – ngreenwood6

-1

इस स्पष्ट रूप से प्रति लागू करने के लिए कोई तरीका नहीं है, लेकिन एक विचार DoSomething() मान कि doSomethingElse() एक पैरामीटर के रूप में स्वीकार करता है:

retval = doSomething(); 
    doSomethingElse(retval); 

कि जिस तरह से कम से कम आप से किसी को रोकने के कम से कम तर्क की आपूर्ति किए बिना doSomethingElse() को कॉल करना ... बेशक, क्या वे कॉल करने से उस तर्क को प्राप्त करते हैं कुछ() एक और मुद्दा है। लेकिन यह एक शुरुआत है।

आइडिया कोड पूर्ण से उठाया गया।

+5

मुझे नहीं लगता कि यह कुछ हल कैसे करता है। सवाल समझने का एकमात्र तरीका यह है कि अगर कुछ() कुछ अतुल्यकालिक कर रहा है। लौटने और गुजरने वाले मूल्यों का कोई प्रभाव नहीं पड़ता है जब काम पूरा हो जाता है। – Nosredna

6

वास्तव में आप जो कुछ भी चाहते हैं वह कर सकते हैं jQuery (कम से कम कुछ अर्थ में)। इसे थोड़ा सा हैकी माना जा सकता है लेकिन दोषपूर्ण काम करता है।

बस अपने पृष्ठ में एक तत्व शामिल करें जिसका आप किसी और चीज़ के लिए उपयोग नहीं करते हैं। जैसे कहीं एक खाली div।

<div id="syncFnHolder"></div> 

और फिर अपने कार्यों + runMe समारोह मुझे द्वारा लिखित के साथ जे एस शामिल हैं।

function doSomething() { alert("First"); } 
function doSomethingElse() { alert("Second"); } 
function doSomethingElseThree() { alert("Third"); } 

function runMe(fn, selec) { 
    return function() { 
     fn(); 
     setTimeout(function() { 
      $(selec).dequeue("syncFnQueue"); 
     }, 1000); 
    } 
}; 

var selector = "#syncFnHolder"; 
//add three functions to a queue 
$(selector).queue("syncFnQueue", runMe(doSomething, selector)); 
$(selector).queue("syncFnQueue", runMe(doSomethingElse, selector)); 
$(selector).queue("syncFnQueue", runMe(doSomethingElseThree, selector)); 
//start first function in queue (FIFO) others are triggered automatically 
$(selector).dequeue("syncFnQueue"); 

यह उन दोनों के बीच 1s और कहा, "पहले" "दूसरा" की दूरी के साथ तीन अलर्ट उत्पन्न होगा, "तीसरा"।

यदि आप कोई देरी नहीं चाहते हैं तो सेटटाइमआउट को हटा दें और बस $(selec).dequeue("syncFnQueue"); पर कॉल छोड़ दें।

यदि आपके कार्यों को पैरामीटर की आवश्यकता है उदा। doSomething(x,y,z) आपको runMe फ़ंक्शन को बेहतर आंशिक होने और लौटाए गए फ़ंक्शन को अलग-अलग बनाने के लिए अनुकूलित करने की आवश्यकता है। यहां जांचें या नया प्रश्न पोस्ट करें।

javascript partial

+1

बहुत रोचक – gpilotino

+2

क्यों न केवल एक जेएस ऑब्जेक्ट में अपनी कतार और डेक्यूइंग करें। एक डमी डीओएम तत्व में पॉप करने के लिए व्यर्थ लगता है। – nickytonline

+0

? मैं jQuery के साथ ऐसा कैसे कर सकता हूं? मान लीजिए कि मैं इस दिन (02:45 पूर्वाह्न) के इस समय पर आपका क्या मतलब नहीं रख सकता हूं। – jitter

2

सवाल थोड़ा अस्पष्ट है।

यदि आपके कार्यों में उनके लिए असीमित बिट्स हैं, तो कॉलबैक का उपयोग करें। यही वह है जो वे हैं।

यदि, हालांकि, आप जावास्क्रिप्ट में पहलू उन्मुख प्रोग्रामिंग करना चाहते हैं, तो jQuery-aop पर एक नज़र डालें।

3

आप ऐसा कर सकते हैं ....

function doSomething(callback) { 
    // code for do some thing 
    // now fire off the callback 
    if (typeof callback === 'function') { 
     callback(); 
    } 
} 

function doSomethingElse() { 
} 

doSomething(doSomethingElse); 
संबंधित मुद्दे