2011-02-07 19 views
6

पर कॉफ़ीस्क्रिप्ट टाइमर और 'यह' सूचक, मुझे ब्राउज़र में 'यह' होने पर क्या समस्या है। निम्न उदाहरण में, एबीसी पर पिंगमे() को कॉल करने से 1 सेकंड इंतजार होगा और फिर ब्राउजर कहेंगे कि ऑब्जेक्ट डॉमविंडो में कोई विधि 'func' नहीं है। कक्षा एबीसी (एबीसी) के उदाहरण के लिए 'यह' को हल करने के बजाय, यह इसके बजाय डॉमविंडो को हल करता है, जैसे कि वस्तु शामिल नहीं थी। मैं स्पष्ट रूप से समझ नहीं पा रहा हूं कि सेटटाइमआउट कॉलबैक स्कोप के संबंध में कैसे काम करता है। कोई सुझाव मैं इस कॉलबैक को कैसे सफल कर सकता हूं?कॉलबैक

class ABC 
    @func = null 

    constructor: (func) -> 
    @func = func 

    pingMe: -> 
    setTimeout(doPing, 1000) 

    doPing = -> 
    @func() 

abc = new ABC -> 
    alert "HI" 
abc.pingMe() 
+1

एचएम, सेटटाइमआउट लाइन को 'obj = it में बदल रहा है; सेटटाइमआउट ((-> obj.doPing()), 1000) 'और डूपिंग घोषणा 'करने के लिए: ->' इसे ठीक करने लगता है। ऐसा लगता है कि कॉफीस्क्रिप्ट इन परिदृश्यों में नियमित जावास्क्रिप्ट व्यवहार रखता है। – Larry

उत्तर

10

मुझे यह कोड काम कर रहा है।

class ABC 
    @func = null 

    constructor: (func) -> 
    @func = func 

    pingMe: -> 
    setTimeout => 
    @doPing() 
    , 1000 

    doPing: -> 
    @func() 

abc = new ABC -> 
    alert "HI" 
abc.pingMe() 

आपका डोपिंग विधि doPing = -> परिभाषित किया गया था, जबकि अन्य सभी name: -> उपयोग करते हैं, मैं इसे इस तरह से बदल दिया है। pingMe फ़ंक्शन में this को बाध्य करने के लिए एक अज्ञात फ़ंक्शन बनाने के लिए => का उपयोग करता है, और @doPing का उपयोग करता है।

यह सुनिश्चित नहीं है कि यह सही है, तो मैं शायद ही कभी जावास्क्रिप्ट का उपयोग करता हूं। लेकिन मुझे उम्मीद है कि यह आपको आगे देखने के लिए एक दिशा दे सकता है।

+0

हाँ यह है। '=> 'का मेरा ज्ञान कमी थी। – Larry

0

शायद थोड़ी अधिक स्पष्टता के लिए, आप इसके बजाय "डूपिंग" विधि को बांध सकते हैं। यह थोड़ा क्लीनर और एफडब्ल्यूआईडब्लू देखेंगे, मुझे लगता है कि यह बेहतर है कि आप जो हासिल करना चाहते हैं उसे व्यक्त करते हैं।

class ABC 
    @func = null 

    constructor: (func) -> 
    @func = func 

    pingMe: -> 
    setTimeout => @doPing, 1000 

    doPing: => 
    @func() 

abc = new ABC -> 
    alert "HI" 
abc.pingMe() 
+0

मुझे विश्वास है कि '=> @doPing()' होना चाहिए। '=> @ डूपिंग' एक फ़ंक्शन पर मूल्यांकन करता है जो बाध्य फ़ंक्शन देता है, न कि फ़ंक्शन को बाध्य फ़ंक्शन कहते हैं। रेइनर का जवाब देखें। – joeytwiddle

1

एक वैकल्पिक समाधान है जो आप ES5 में क्या करेंगे के करीब है:

pingMe: -> 
    setTimeout (@doPing.bind @), 1000 

ध्यान दें कि bind है:

pingMe: -> 
    setTimeout(@doPing.bind(@), 1000) 

या आप कोष्ठकों को बचाने के लिए करना चाहते हैं ES5, तो संस्करण 9 से IE में केवल available है।


यह भी ध्यान रखें, तो आप चाहिए हर हालत से बचने प्रलोभन पर कोशिश करने के लिए:

setTimeout(@doPing.bind @, 1000) # BAD! 
     or 
    setTimeout @doPing.bind @, 1000  # BAD! 

क्योंकि उन दोनों के setTimeoutbind से पीछे तर्क के रूप में संख्या गुजरती हैं, नहीं!