2015-02-27 5 views
6

मैं निम्नलिखित कोड है:कुछ एक बार करते हैं, तो में प्रत्येक 15 सेकंड js प्रतिक्रिया

var Panel = React.createClass({ 

    getInitialState: function() { 
    return { 
     user_id: null, 
     blogs: null, 
     error: false, 
     error_code: '', 
     error_code: '' 
    }; 
    }, 

    shouldComponentUpdate: function(nextProps, nextState) { 
    if (nextState.error !== this.state.error || 
     nextState.blogs !== this.state.blogs || 
     nextState.error_code !== this.state.error_code 
    ) { 
     return true; 
    } 
    }, 

    componentDidMount: function() { 
    var self = this; 
    var pollingInterval = setInterval(function() { 
     $.get(self.props.source, function(result) { 
     if (self.isMounted()) { 
      self.setState({ 
      error: false, 
      error_code: '', 
      error_message: '', 
      blogs: result.user.blogs, 
      user_id: result.user.id 
      }); 
     } 
     }.bind(self)).fail(function(response) { 
     self.setState({ 
      error: true, 
      error_code: response.status, 
      error_message: response.statusText 
     }); 
     }.bind(self)); 
    }, 1000); 
    }, 

    render: function() { ... } 

}); 

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

लेकिन मैं कुछ बदलाव करने की जरूरत है, और इस मैं कहाँ खो रहा हूँ। मैं कहना चाहता हूं: एक बार प्राप्त करें, पास या असफल - इससे कोई फर्क नहीं पड़ता। पास की परवाह किए बिना या असफल

इस विशिष्ट मामले में है मैं सामान्य रूप से एक रीढ़ संग्रह और रूटर ऊपर स्पिन होगा यह सब करने के लिए एक जनमत सर्वेक्षण सहायक के साथ, लेकिन कोई - तो प्रत्येक 15 सेकंड कि प्रारंभिक लाने के बाद, फिर से कोशिश अतिरिक्त ओवरहेड की आवश्यकता है। तो वह है जहां मैं फंस गया हूँ। मैं प्राप्त करने का प्रयास कर रहा हूं जो मैं पूरा कर सकता हूं?

+0

आप नहीं कर सकते बस एक विधि जोड़ें जो बढ़ने के बाद, हर 15 सेकंड कहा जाता है? बस उस कोड को 'setInterval' के शरीर में एक फ़ंक्शन में ले जाएं, और' घटकडिडमाउंट' में, इसे शुरू करें। और दोहराओ। आप 'isMounted()' संभावित रूप से जांचना चाहते हैं। – WiredPrairie

+0

मुझे लगता है कि सोच रहा था, लेकिन मुझे नहीं पता था कि अगर काम करेगा क्योंकि मेरा मानना ​​है कि componentDidMount केवल एक बार के बाद कहा जाता है प्रस्तुत करना? जब तक एक दरार सिर नहीं है? – TheWebs

+0

(मुझे दवा की आदतों के बारे में निश्चित नहीं है ... :-))। हां, 'घटकडिडमाउंट' केवल एक बार निष्पादित किया जाता है: http://facebook.github.io/react/docs/component-specs.html। तो, आप इसे वहां शुरू कर सकते हैं। जब घटक अनमाउंट किया जाता है तो आप टाइमर को अक्षम करना चाहते हैं। – WiredPrairie

उत्तर

12

तुम सिर्फ अपने कोड थोड़ा अपने मतदान समारोह में कुछ अलग अलग तरीकों से कॉल करने के लिए सक्षम होने के लिए refactor करने के लिए सक्षम होना चाहिए (जैसे मैन्युअल उदाहरण के लिए और फिर एक निर्दिष्ट अंतराल पर):

componentDidMount: function() { 
    this.startPolling(); 
}, 

componentWillUnmount: function() { 
    if (this._timer) { 
     clearInterval(this._timer); 
     this._timer = null; 
    } 
}, 

startPolling: function() { 
    var self = this; 
    setTimeout(function() { 
     if (!self.isMounted()) { return; } // abandon 
     self.poll(); // do it once and then start it up ... 
     self._timer = setInterval(self.poll.bind(self), 15000); 
    }, 1000); 
}, 

poll: function() { 
    var self = this; 
    $.get(self.props.source, function(result) { 
     if (self.isMounted()) { 
     self.setState({ 
      error: false, 
      error_code: '', 
      error_message: '', 
      blogs: result.user.blogs, 
      user_id: result.user.id 
     }); 
     } 
    }).fail(function(response) { 
     self.setState({ 
     error: true, 
     error_code: response.status, 
     error_message: response.statusText 
     }); 
    }); 
} 
+0

यह उत्कृष्ट समझ में आता है, धन्यवाद। – TheWebs

+0

यह उत्तर अब अद्यतित नहीं है, क्योंकि 'isMounted' अब दिखाया गया है:' चेतावनी: isMounted (...) को सादे जावास्क्रिप्ट प्रतिक्रिया कक्षाओं में बहिष्कृत किया गया है। इसके बजाए, मेमोरी लीक को रोकने के लिए घटक WillUnmount में सब्सक्रिप्शन और लंबित अनुरोधों को साफ़ करना सुनिश्चित करें –

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