2012-10-27 21 views
7

में एसिंक फ़ंक्शन को कॉल करें मेरे पास निम्न उदाहरण कोड है - पहला भाग एसिंक कॉल कर सकता है या नहीं - किसी भी तरह से इसे जारी रखना चाहिए। मैं शेष कोड को async कॉलबैक के भीतर नहीं डाल सकता क्योंकि स्थिति को गलत होने पर इसे चलाने की आवश्यकता होती है। तो यह कैसे करें?सशर्त रूप से नोड

if(condition) { 
    someAsyncRequest(function(error, result)) { 
     //do something then continue 
    } 
} 

//do this next whether condition is true or not 

मुझे लगता है कि कोड डाल एक समारोह में बाद आने के लिए जाने के लिए और इसके बाद के संस्करण या एक और को फोन पर अगर हालत झूठी है async कॉल के भीतर है कि समारोह कॉल करने के लिए जिस तरह से हो सकता है - लेकिन वहाँ एक वैकल्पिक तरीका है मुझे कार्यों में इसे तोड़ने की आवश्यकता नहीं है?

+0

Async-का इंतजार पैकेज मदद मिल सकती है (एक सिंक शैली में एसिंक कोड लिखने की अनुमति देता है, अपवादों का समर्थन करता है आदि) https://www.npmjs.com/package/asyncawait - ऐसे वाक्यविन्यास को भविष्य में नोड संस्करणों में भी मूल रूप से समर्थित किया जाएगा, https: // github देखें।कॉम/नोडज/वादे/मुद्दे/4 –

उत्तर

3

बस की घोषणा कुछ अन्य समारोह जब भी आप इसकी आवश्यकता है चलाने के लिए:

var otherFunc = function() { 
    //do this next whether condition is true or not 
} 

if(condition) { 
    someAsyncRequest(function(error, result)) { 
     //do something then continue 

     otherFunc(); 
    } 
} else { 
    otherFunc(); 
} 
+3

हां, जैसा कि मैंने अभी उल्लेख किया है, वही है - बस सोच रहा है कि एक ऐसा तरीका था जो किसी फंक्शन – cyberwombat

+0

@Yashua में कोड को encapsulating से बचा था, क्योंकि कोई भी क्योंकि आपके कुछ एसिंक्रैक्वेस्ट असीमित है, तो आप गारंटी नहीं दे सकते जब इसे निष्पादित किया जाएगा, और चूंकि जावास्क्रिप्ट मूल रूप से * बहु * थ्रेडेड नहीं है, तब तक आप अपने प्रोग्राम के कुछ हिस्से को "रोक" नहीं सकते हैं जब तक कि कुछ एसिंक कॉल नहीं किया जाता है। इस प्रकार, आपको किसी फ़ंक्शन के अंदर बाद में निष्पादित करने के लिए कोड के हिस्से की रक्षा करने की आवश्यकता है और उचित समय पर कॉल करें (यानी, तुरंत, या केवल जब एसिंक कोड निष्पादित किया गया हो)। –

3

बस एक एक और तरीका यह करने के लिए, यह कैसे मैं पैटर्न निकाला है। कुछ पुस्तकालय (वादे?) हो सकते हैं जो एक ही चीज़ को संभालते हैं।

function conditional(condition, conditional_fun, callback) { 
    if(condition) 
     return conditional_fun(callback); 
    return callback(); 
} 

और फिर कोड पर आप लिख सकते हैं

conditional(something === undefined, 
      function(callback) { 
       fetch_that_something_async(function() { 
        callback(); 
       }); 
      }, 
      function() { 

         /// ... This is where your code would continue 


      }); 
0

मैं clojurescript जो जो जीवन सुपर आसान जब async कॉल से निपटने में आता है एक भयानक core-async पुस्तकालय है का उपयोग कर की सिफारिश करेंगे।

(go 
    (when condition 
    (<! (someAsyncRequest))) 
    (otherCodeToHappenWhetherConditionIsTrueOrNot)) 

नोट go मैक्रो जो शरीर एसिंक्रोनस रूप से चलाने के लिए कारण होगा, और <! समारोह जो जब तक async समारोह वापस आ जाएगी अवरुद्ध कर देगा:

आपके मामले में, आप कुछ इस तरह लिखते थे। <! फ़ंक्शन when स्थिति के अंदर होने के कारण, यह स्थिति केवल तभी खुल जाएगी जब स्थिति सत्य है।

+0

@kleopatra कृपया मेरे संपादन को उत्तर में देखें। मुझे उम्मीद है कि यह अब बेहतर है। – Asher

+0

अद्यतन के लिए धन्यवाद :-) – kleopatra

7

एक पुस्तकालय जो मैंने नोड में उपयोग किया है अक्सर असिनक (https://github.com/caolan/async) है। आखिरकार मैंने जांच की कि ब्राउजर के लिए भी इसका समर्थन है ताकि आप अपने वितरण में एनपीएम/कॉन्सैट/इसे कम करने में सक्षम होना चाहिए। यदि आप सर्वर-साइड पर इसका उपयोग कर रहे हैं तो आपको https://github.com/continuationlabs/insync पर विचार करना चाहिए, जो कि एसिंक का थोड़ा बेहतर संस्करण है, जिसमें कुछ ब्राउज़र समर्थन हटा दिए गए हैं।

सशर्त एसिंक कॉल का उपयोग करते समय मैं उपयोग किए जाने वाले सामान्य पैटर्न में से एक है जो मैं क्रम में उपयोग करना चाहता हूं और async.waterfall को पास करता हूं।

मैंने नीचे एक उदाहरण शामिल किया है।

var tasks = []; 

if (conditionOne) { 
    tasks.push(functionOne); 
} 

if (conditionTwo) { 
    tasks.push(functionTwo); 
} 

if (conditionThree) { 
    tasks.push(functionThree); 
} 

async.waterfall(tasks, function (err, result) { 
    // do something with the result. 
    // if any functions in the task throws an error, this function is 
    // immediately called with err == <that error> 
}); 

var functionOne = function(callback) { 
    // do something 
    // callback(null, some_result); 
}; 

var functionTwo = function(previousResult, callback) { 
    // do something with previous result if needed 
    // callback(null, previousResult, some_result); 
}; 

var functionThree = function(previousResult, callback) { 
    // do something with previous result if needed 
    // callback(null, some_result); 
}; 

बेशक आप इसके बजाय वादे का उपयोग कर सकते हैं। किसी भी मामले में मैं async या वादे का उपयोग करके घोंसले कॉलबैक से बचना पसंद करता हूं।

चीजें आप नहीं नेस्टेड कॉलबैक का उपयोग करके बच सकते हैं में से कुछ चर टक्कर, उत्थापन कीड़े, सही>>>>, हार्ड पढ़ने के लिए कोड के लिए "मार्चिंग", आदि

+1

एफडब्ल्यूआईडब्ल्यू, असिंक यहां शामिल पहले विरोधी पैटर्न का विकल्प है: http://webapplog.com/seven-things-you-should-stop-doing-with-node-js / – zedd45

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