2012-08-22 33 views
15

का उपयोग करके मैं असिनक कार्य के साथ एक पार्सर लिख रहा हूं। मैं jQuery का उपयोग एसिंक कार्यों को नियंत्रित करने और ऑर्डर करने का वादा करता हूं। यह निर्माता समारोह का एक छद्म कोड संस्करण है:

/** 
    * @constructor 
    */ 
    function Parser(json) 
    { 
     return $.when(
      this.delete().then(this.insert(json)), 
      this.doSomething(), 
      this.doSomethingElse().then(this.update(json)) 
     ) 
    }; 

और इस एक उदाहरण समारोह दिखता है जैसे:

Parser.prototype.doSomething = function() 
{ 
    var dfd = $.Deferred(); 

    exampleTask(dfd.reject, dfd.resolve); 

    return dfd.promise(); 
}; 

JQuery डॉक्स से:

मामले में जहां में एकाधिक डिफर्ड ऑब्जेक्ट्स को jQuery पर भेज दिया जाता है। जब, विधि एक नए "मास्टर" डिफर्ड ऑब्जेक्ट से वादा वापस लौटाती है जो बी के सभी डिफरर्ड की कुल स्थिति को ट्रैक करती है een पारित कर दिया

मैं .progress() कोई भी व्यक्ति उस पार्सर के समग्र प्रगति के बारे में परवाह है सूचित करने के लिए उपयोग कर सकते हैं कैसे? उदा।

var parser = new Parser(json); 
parser.progress(function(prog){console.log(prog}); 

यहाँ मैं क्या कर रहा हूँ के साथ एक बेला: http://jsfiddle.net/ashanova/RjULA/2/

उत्तर

14

उपयोग deferred.notify()progressCallbacks कॉल करने के लिए। उदाहरण के लिए:

function doSomething() { 
    var dfd = $.Deferred(); 

    var count = 0; 
    var intervalId = setInterval(function() { 
     dfd.notify(count++); 
     count > 3 && clearInterval(intervalId); 
    }, 500); 

    return dfd.promise(); 
}; 

var promise = doSomething(); 

promise.progress(function(prog) { 
    console.log(prog); 
});​ 

DEMO

+0

मुझे पता लगाया गया कि कैसे उपयोग करें। किसी फ़ंक्शन के भीतर नोटिफ़ाई करें (जैसा कि आपके डेमो में है), लेकिन मैं इसे वापस कन्स्ट्रक्टर तक पास करना चाहता हूं और वहां से समग्र प्रगति को सूचित करना चाहता हूं। मैं देखना चाहता हूं कि पार्सर समग्र रूप से कहां है, न कि इसके कार्य - यदि आप मेरे पीछे आते हैं? – JonWells

+0

@Jaoa इस तरह: http://jsfiddle.net/ashanova/RjULA/2/ – JonWells

+0

@CrimsonChin: सुनिश्चित नहीं है कि मैं आपके प्रश्न को सही तरीके से समझ गया हूं, लेकिन उस स्थिति में, आपको संदर्भ बनाने और स्टोर करने की आवश्यकता होगी आपके कन्स्ट्रक्टर में '$। डिफर्ड' करने के लिए, ताकि आप प्रत्येक विधि के भीतर 'अधिसूचित' कॉल कर सकें। इन पंक्तियों के साथ कुछ: http://jsfiddle.net/B7nzy/ –