jquery

2013-08-07 2 views
6

का उपयोग किये बिना डिफरर्ड ऑब्जेक्ट को कार्यान्वित करें मैं jQuery का उपयोग किए बिना मूल डिफरर्ड ऑब्जेक्ट को कार्यान्वित करना चाहता हूं। यहां मैं कार्यों को हल और अस्वीकार करने के साथ ही केवल निष्पादित और विफल कॉलबैक लागू कर दूंगा। और इस समारोह के साथ promise विधि को जोड़ने के लिए।jquery

मैं शुद्ध js में निम्नलिखित कार्यान्वयन (संपादित) कर रहा हूँ:

function Deferred() { 
    var d = {}; 
    d.resolve = function() { 
     d.done(arguments); 
    } 
    d.reject = function() { 
     d.fail(arguments); 
    } 
    d.promise = function() { 
     var x = {}; 
     x.done = function(args) { 
      return args; 
     } 
     x.fail = function(args) { 
      return args; 
     } 
     return x; 
    } 
    return d; 
} 


var v; 

var setVal = function() { 
    var d = new Deferred(); 
    setTimeout(function() { 
     v = 'a value'; 
     d.resolve(this); 
    }, 5000); 
    return d.promise(); 
}; 

setVal().done(function() { 
    console.log('all done :' + v); 
}); 

लेकिन इसके बाद के संस्करण त्रुटि देता है: Object #<Object> has no method 'fail'

मैं Deferred() समारोह के लिए लौट आए वस्तु 'प' पता नहीं है विधि()। और अगर मैं Deferred() से d.promise देता हूं तो इसमें कार्यों को हल और अस्वीकार नहीं किया जाएगा।

कृपया बताएं कि मैं डिफरर्ड ऑब्जेक्ट के सरल उद्देश्य को प्राप्त करने के लिए क्या त्रुटि कर रहा हूं। आप `new` साथ एक उदाहरण बनाने हैं तो आप` prototype` करने के तरीकों जोड़ना चाहिए http://jsfiddle.net/SyEmK/14/

+0

:

यहाँ बेला मैं कर रहा हूँ है। कन्स्ट्रक्टर एक उदाहरण देता है, भले ही आप 'वापस लौटें'। आप 'var d = deferred()' – elclanrs

+0

चाहते हैं कि आपके पास कोई विधि नहीं है। यदि आप अपनी वस्तु को देखते हैं, तो आपने संकल्प, अस्वीकार कर दिया है और वादा किया है। setVal() उन ऑब्जेक्ट्स के साथ आपके ऑब्जेक्ट का एक उदाहरण देता है। – THEtheChad

+0

jQuery वादे को लागू करने के लिए एकमात्र पुस्तकालय नहीं है। – JayC

उत्तर

18
function Deferred(){ 
    this._done = []; 
    this._fail = []; 
} 
Deferred.prototype = { 
    execute: function(list, args){ 
    var i = list.length; 

    // convert arguments to an array 
    // so they can be sent to the 
    // callbacks via the apply method 
    args = Array.prototype.slice.call(args); 

    while(i--) list[i].apply(null, args); 
    }, 
    resolve: function(){ 
    this.execute(this._done, arguments); 
    }, 
    reject: function(){ 
    this.execute(this._fail, arguments); 
    }, 
    done: function(callback){ 
    this._done.push(callback); 
    }, 
    fail: function(callback){ 
    this._fail.push(callback); 
    } 
} 


var v; 

var setVal = function() { 
    var d = new Deferred(); 
    setTimeout(function() { 
     v = 'a value'; 
     d.resolve(this); 
    }, 5000); 
    return d; 
}; 

setVal().done(function() { 
    console.log('all done :' + v); 
}); 
+4

यदि आप jQuery व्यवहार के करीब भी आना चाहते हैं, तो आप एक "वादा" फ़ंक्शन जोड़ना चाहेंगे जो एक देता है केवल "पूर्ण" और "असफल" के साथ ऑब्जेक्ट (ताकि कॉलिंग फ़ंक्शन को हल/अस्वीकार करने की पहुंच न हो)। इसके अलावा - आप चेनिंग की अनुमति देने के लिए "यह" निष्पादित/असफल से वापस कर सकते हैं। – lyosef