2013-09-30 9 views
5

मेरी स्क्रिप्ट में, मैं नाम में इनकोडिंग मूल्यों कन्वर्ट करने के लिए एक शब्दकोश को पुनः प्राप्त करने की जरूरत है:सशर्त वादों

$.ajax({ 
    // retrieve dictionary 
}) 
.done(function(dictionary){ 
    // convert encoded values into names 
}) 
.done(function(){ 
    // run my application 
}); 

लेकिन, कभी कभी शब्दकोश पहले से ही एक अन्य अनुप्रयोग द्वारा लोड किया गया है, और इस मामले में मुझे नहीं पता

// load dictionary if needed 
// then run my application 
:

if (dictionary) { 
    // convert encoded values into names 
    // run my application 
} 
else { 
$.ajax({ 
    // retrieve dictionary 
}) 
.done(function(dictionary){ 
    // convert encoded values into names 
}) 
.done(function(){ 
    // run my application 
}); 
} 

यह अगर/किसी और बयान नहीं बल्कि भारी है, वहाँ यह कम करने के लिए एक तरीका है: ajax कॉल की जरूरत है

नोट: मैंने अपने छद्म कोड के लिए $ साइन का उपयोग किया, लेकिन मुझे जरूरी नहीं कि jQuery से जुड़ा हुआ हो।

+1

मैं इस तरह की चीज को अपने अनुप्रयोगों में बहुत कुछ करता हूं। जो चीज आपको मिलती है, वह यह है कि यदि डेटा अतुल्यकालिक रूप से अधिग्रहण किया जाता है तो आपको इसे अतुल्यकालिक तरीकों से एक्सेस करना चाहिए, भले ही यह पहले से अधिग्रहित हो या नहीं - प्रत्येक उपयोग पर कारण होने पर, आपको नहीं पता कि डेटा क्या है तुरंत उपलब्ध है या फिर इसे लाने की जरूरत है या नहीं। –

+0

@ बीटरूट-बीटरूट क्या आप समझा सकते हैं कि आप पहले से अधिग्रहित डेटा को एसिंक्रोनस विधियों के साथ कैसे एक्सेस करते हैं? शायद कोड या छद्म कोड के साथ एक उत्तर पोस्ट करें? – Christophe

+0

पहले से पोस्ट किए गए उत्तरों को देखें। लोग यही समझाने की कोशिश कर रहे हैं। –

उत्तर

0

हो सकता है कि एक फर्जी वादा बनाने $ के साथ? कब?

var promise; 
if (dictionary) promise = $.when(dictionary); 
else { 
    promise = $.ajax({ 

    }) 
    .done(function(dictionary){ 
     // convert encoded values into names 
    }); 
} 

promise 
    .done(function(){ 
     // run my application 
    }); 
2

आपको $.ajax() बिल्कुल एक बार कॉल करना चाहिए, और अपने (वैश्विक-आईएसएच) dictionary चर में लौटा वादा स्टोर करना चाहिए।

फिर, हर बार जब आप परिणाम का उपयोग करना चाहते हैं, तो बस dictionary.then(...) लिखें।
यदि AJAX अनुरोध पहले ही समाप्त हो गया है, तो कॉलबैक तुरंत चलाएगा।

+1

अच्छा, ऐसा नहीं है कि यह कैसे काम करता है। जैसा कि मैंने सवाल में कहा था, यहां तक ​​कि जब मेरा कोड शुरू होता है तब भी शब्दकोश पहले से मौजूद हो सकता है (किसी अन्य स्क्रिप्ट द्वारा लोड किया गया है जो मेरे नियंत्रण में नहीं है), और इस मामले में मुझे पहले AJAX कॉल की भी आवश्यकता नहीं है। उदाहरण के लिए शब्दकोश स्थानीय स्टोरेज में संग्रहीत किया जा सकता है। – Christophe

+0

@ क्रिस्टोफ़े: फिर वैश्विक को पूर्व-हल किए गए वादे पर सेट करें और '.then()' वैसे भी कॉल करें। – SLaks

+0

ठीक है, यही वह है जिसे मैं समझने की कोशिश कर रहा हूं, एक सशर्त वादा कैसे लिखना है। – Christophe

3

यह पैटर्न मैं आम तौर पर उपयोग करते हैं:

var done = function() { 
    //continue loading application 
} 

if(!dictionary) { 
    $.ajax({ 

    }) 
     .done(done); 
} else { 
    done.apply(this); 
} 

एक बहुत ही इसी तरह के पैटर्न, कि हमेशा एक आस्थगित वस्तु का उपयोग करता है, हो सकता है निम्नलिखित:

var 
    dictionaryDeferred = new $.Deferred(), 
    dictionaryPromise = dictionaryDeferred.promise(); 

if(!dictionary) { 
    $.ajax({ 

    }) 
     .done(function() { 
      //do something with the response 
      dictionaryDeferred.resolve(); 
     }); 
} else { 
    dictionaryDeferred.resolve(); 
} 

dictionaryPromise.then(function() { 
    //continue loading application 
}); 
+0

धन्यवाद। मुझे दूसरा पैटर्न बेहतर पसंद है, क्योंकि यह चेनिंग को आसान बनाता है। एक मुद्दा यह हो सकता है कि शब्दकोशप्रोमा का हल मूल्य दो शाखाओं के बीच संगत नहीं है (लेकिन मेरे मामले में कोई समस्या नहीं है क्योंकि शब्दकोश वैश्विक चर है)। – Christophe

+0

आपको उन दोनों स्थानों पर 'dictionaryPromise' का उपयोग करने की आवश्यकता नहीं है जहां शब्दकोश का अनुरोध किया जा सकता है, आप इसे इस स्थान पर उपयोग कर सकते हैं जहां आवेदन लोड हो रहा है, यदि आप चाहें, क्योंकि आप अभी भी' if (! शब्दकोश 'की जांच कर रहे हैं) 'पहले से मौजूद है या नहीं। – Adam

+0

$ 'के साथ' नया 'का उपयोग क्यों करें। (नया' का उपयोग वैकल्पिक है? –

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