2016-08-16 6 views
13

मेरे पास जावास्क्रिप्ट में एक असीमित कार्य था और मैंने इसे सेटटाइमआउट जोड़ा। कोड इस तरह दिखता है:सेटटाइमआउट में async का उपयोग वैध है?

 let timer; 
     clearTimeout(timer); 
     timer =setTimeout(() => { 
     (async() => { 
      await this._doSomething(); 
     })(); 
     }, 2000); 

सेटटाइमआउट का puprose फ़ंक्शन चलाने से 2 सेकंड पहले जोड़ना है। यह सुनिश्चित करना है कि उपयोगकर्ता टाइपिंग बंद कर दिया।

क्या मुझे इस फ़ंक्शन से async/प्रतीक्षा करना चाहिए, क्योंकि सेटटाइमआउट वैसे भी असीमित है?

यहां कोई भी मदद की बहुत सराहना की!

+0

_ "कोड ऐसा दिखता है" _ असंभव है, और यही कारण है कि आपको 'async' और' प्रतीक्षा 'नहीं हटा देना चाहिए। इस उदाहरण में इसका कोई मतलब नहीं है, लेकिन इसका मतलब यह नहीं है कि यह वास्तविक कोड में व्यर्थ है। – zeroflagL

+1

यह थोड़ा अस्पष्ट है कि आप यहां क्या पूछ रहे हैं। कोड ** का टुकड़ा ** ** काम करने के लिए और कैसे 'async' और 'await' ** को हटा सकता है ** ** बदल सकता है? एक स्पष्ट प्रश्न के बिना जिसमें वास्तविक * उत्तर * है, आप बस बहुत व्यापक और राय सलाह प्राप्त कर रहे हैं। – noppa

+0

मैंने इसे और स्पष्ट करने के लिए प्रश्न संपादित किया है कि मैं क्या हासिल करने की कोशिश कर रहा हूं। – Marta

उत्तर

24

setTimeout, एक समारोह कॉल करने से पहले एक देरी कहते हैं जबकि async/await वादे के ontop वाक्यात्मक चीनी है, चेन कोड के लिए एक रास्ता एक कॉल पूर्ण होने के बाद चलाने के लिए है, इसलिए वे ' अलग अलग

setTimeout भयानक त्रुटि हैंडलिंग लक्षण है, इसलिए मैं सभी कोड में निम्नलिखित की सिफारिश:

let wait = ms => new Promise(resolve => setTimeout(resolve, ms)); 

और फिर setTimeout सीधे फिर से फोन कभी नहीं।

आपका कोड अब हो जाता है: doSomething समाप्त करने के लिए के लिए

let foo = async() => { 
    await wait(2000); 
    await this._doSomething(); 
} 

foo छोड़कर प्रतीक्षा करता है। यह आमतौर पर वांछनीय है, लेकिन संदर्भ के बिना यह जानना मुश्किल है कि आप क्या चाहते हैं। आप अन्य कोड के साथ समानांतर में doSomething चलाने के लिए होती हैं, तो मेरा सुझाव है:

async() => { await Promise.all([foo(), this._otherCode()]); }; 

में शामिल होने और एक ही स्थान पर त्रुटियों पर कब्जा करने की।

आप वास्तव में आग और _doSomething भूल जाते हैं और न इसके लिए इंतजार करने के लिए होती हैं, तो आप await खो सकते हैं, लेकिन आप की कोशिश करनी चाहिए/कैच त्रुटियों:

async() => { 
    let spinoff = async() => { try { await foo(); } catch (e) { console.log(e); } }; 
    spinoff(); // no await! 
} 

लेकिन मैं उस पैटर्न की सलाह नहीं देते, के रूप में यह सूक्ष्म है और याद करने में आसान हो सकता है।

-3
/* contrived example alert */ 
var foo = 'poo'; 
function setFoo(callback) (
    setTimeout(function(){ 
     foo = 'bar'; 
     callback(); 
    }, 100); 
); 
setFoo(function() { 
    alert(foo); 
}); 
+1

मुझे डाउनवॉट्स दिखाई देता है लेकिन डाउनवॉट्स को स्पष्ट करने के लिए कोई टिप्पणी नहीं है ... यह सवाल का जवाब कैसे देता है? और आप भी 'async' फ़ंक्शन का उपयोग नहीं कर रहे हैं जो इस सवाल के बारे में पूछ रहा है। – aug

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