सब से पहले, की घोषणा let b = true
के बाहर कॉलबैक समारोह । यह पुनः प्रारंभ पर प्रत्येक कॉल अन्यथा.
दूसरे, 10000 में clearTimeout(fnInterval, 10000)
नहीं है एक वैध पैरामीटर । clearTimeout(timeoutId)
स्वीकार करता है, केवल पहली पैरामीटर और साफ करता है मध्यांतर पारित कर दिया में तुरंत. आप की आवश्यकता होगी एक setTimeout
ट्रिगर करने के लिए इस 10 सेकंड के बाद, अगर वह अपने लक्ष्य है. लेकिन कारण बनता है कि एक दौड़ की स्थिति के बीच दो समय समाप्ति -- अस्पष्टता का मतलब कर सकते हैं आप याद करेंगे के कुछ लॉग या हवा के साथ लॉग.
एक काउंटर का उपयोग कर एक समाधान है, के रूप में अन्य जवाब दिखाने के लिए, लेकिन आम तौर पर जब मैं कर रहा हूँ का उपयोग कर जटिल समय के साथ setInterval
की आवश्यकता है कि यह समाशोधन के बाद कुछ पुनरावृत्तियों की संख्या, मैं refactor करने के लिए एक सामान्य promisified sleep
समारोह के आधार पर setTimeout
. इस रहता है, बुला कोड बहुत क्लीनर (कोई कॉलबैक) और से बचा जाता है के साथ खिलवाड़ clearTimeout
.
के बजाय एक बूलियन फ्लिप करने के लिए एक ध्वज के बीच आगे और पीछे दो संदेश, एक बेहतर समाधान है करने के लिए एक सरणी का उपयोग करें और मापांक वर्तमान सूचकांक द्वारा संदेश सरणी की लंबाई. इस बनाता है यह बहुत आसान करने के लिए और अधिक आइटम जोड़ने के लिए चक्र के माध्यम से और कोड समझने के लिए आसान है के बाद से राज्य में निहित है काउंटर.
const sleep = ms => new Promise(res => setInterval(res, ms));
(async () => {
const messages = ["hi", "bye"];
for (let i = 0; i < 10; i++) {
console.log(messages[i%messages.length]);
await sleep(1000);
}
})();