2015-03-23 18 views
5

मैं एक मॉड्यूल है। मैं प्रत्येक पुनरावृत्ति पर progress.val में वृद्धि करना चाहता हूं। इस प्रगति तो नमूदार होना चाहिए:अवलोकन ES6 मॉड्यूल गुण

System.import('components/Service.js') 
    .then(function(M){ 
      self.progress = M.progress; 

      Object.observe(M.progress,function(c){ 
       console.dir(c); 
      }); 
     }); 

दुर्भाग्य से, पर्यवेक्षकों कॉलबैक केवल एक बार शुरू हो जाती है, यात्रा प्रति एक आइटम के साथ परिवर्तन की एक सरणी पकड़े।

मैं प्रत्येक पुनरावृत्ति पर कॉलबैक कैसे लगा सकता हूं?

+1

इसका वास्तव में मॉड्यूल के साथ कुछ लेना देना नहीं है, इसलिए आप अपने प्रश्न का शीर्षक बदलने के बारे में सोचना चाहेंगे। –

+0

यदि आप सिंक व्यवहार चाहते हैं, तो आप ऑब्जेक्ट.बॉर्स्क को मार सकते हैं और इसके बजाय गेटर/सेटर का उपयोग कर सकते हैं, कुछ कम पुराने-पुराने लेकिन http://jsfiddle.net/g35orqrq/ – dandavis

उत्तर

3

इस तरह ऑब्जेक्ट देखकर ऑब्जेक्ट करता है।

पर्यवेक्षक केवल को रिकॉर्ड के संग्रह के साथ के अगले टिक पर आग लगाएगा। यह व्यक्तिगत परिवर्तनों पर सिंक्रनाइज़ नहीं होता है क्योंकि वे बनाए जाते हैं। Object.Observe Synchronous Callback भी देखें।

आप जो चाहते हैं उसे पूरा करने के लिए, एक दृष्टिकोण आपके इटरेटर को फिर से लिखना है ताकि यह प्रत्येक बार लूप के माध्यम से Object.observe को आग लगाने का मौका दे सके। मैं जरूरी इस सटीक तरीका नहीं की सिफारिश कर रहा हूँ, लेकिन सिर्फ एक उदाहरण के रूप:

function iterate(a, fn) { 
    (function loop() { 
     if (!a.length) return; 
     fn(a.shift()); 
     setTimeout(loop); 
    })(); 
} 

अब, fn द्वारा निरीक्षण वस्तु पर किए गए गुण में कोई परिवर्तन पाश की कि यात्रा के दौरान सूचित किया जाएगा।

आप वादों का उपयोग कर एक ही बात को पूरा कर सकते:

function iterate(a, fn) { 
    a.reduce((p, e) => p.then(() => fn(e)), Promise.resolve()); 
} 

आप (यह एक ES7 सुविधा है, लेकिन इस तरह के कोलाहल के रूप में transpilers में उपलब्ध) एक async/इंतजार वातावरण में होना करने के लिए होता है, तो आप कर सकते थे भी निम्नलिखित है, जो कवर के तहत बारे में वादे के बराबर है ऊपर दृष्टिकोण है: एक तरफ

async function iterate(a, fn) { 
    for (i of a) await fn(i); 
} 

एक के रूप में, आप एक Iife यहां जरूरत नहीं है। इसके अलावा, self घोषित नहीं किया गया है - मुझे self.progress = M.progress लाइन पर रन-टाइम त्रुटि की उम्मीद है।

+2

के समान ईएस 7 फीचर का इंतजार नहीं है? – Loupax

+1

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

+2

निश्चित रूप से, मुझे विश्वास है कि यह ध्यान देना चाहिए क्योंकि सवाल विशेष रूप से ES6 के बारे में था – Loupax

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