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

वर्तमान में मैं उपयोग कर रहा हूँ,

await new Promise(r => setTimeout(r, 5000))

जो रुक जाता है और टाइमआउट समाप्त होने की प्रतीक्षा करता है, लेकिन जब क्लाइंट पावरअप का चयन करता है तो मैं टाइमआउट को कैसे रोक सकता हूं? हम वादा आधारित टाइमआउट कैसे साफ़ करते हैं?

संक्षिप्त होने के लिए मैं जो करना चाहता हूं वह है:

सर्वर साइड कोड

function doSomething(){
     if(playerHasPowerUps) await new Promise(r => setTimeout(r, 5000))
     //do other things
}

क्लाइंट साइड में इस अवधि में यदि खिलाड़ी पावरअप पर क्लिक करता है, तो यह सर्वर को घटना के बारे में सूचित करता है और सर्वर उपरोक्त टाइमआउट को रोकने और अन्य चीजें करने के लिए होता है

1
Ashok 31 अक्टूबर 2019, 06:09

1 उत्तर

सबसे बढ़िया उत्तर

इसका मेरा समाधान एक ऐसा वर्ग तैयार करना होगा जो वादा और टाइमआउट उदाहरणों का प्रबंधन करता है।

आइए इस वर्ग को Sleep नाम दें, यह इसके कंस्ट्रक्टर में अवधि लेता है और दी गई अवधि पर शेड्यूल टाइमआउट के साथ-साथ एक वादा उदाहरण भी बनाता है।

एक एसिंक फ़ंक्शन wait() जोड़ें जो वादा उदाहरण लौटाता है ताकि हम await चालू कर सकें।

एक फ़ंक्शन जोड़ें cancel() जो केवल वादा उदाहरण को हल करता है और टाइमआउट साफ़ करता है।

<html>
	<body>
		<button onClick="cancelWait()">Cancel wait</button>
		<div id="text"></div>
	</body>

	<script lang="javascript">

		class Sleep {
		   constructor(duration) {
			  this.promise = new Promise((resolve) => {
				this.promiseResolve = resolve
				this.timeout = setTimeout(() => {
				  resolve()
				}, duration)
			  })
		   }
		   
		   async wait() {
			  return await this.promise
		   }
		   
		   cancel() {
			  clearTimeout(this.timeout)
			  this.promiseResolve()
		   }
		}

		//Usage
		let sleep
		
		const main = async () => {
			const text = document.getElementById("text")
			text.innerText = 'start'			
						
			sleep = new Sleep(3000)
			await sleep.wait()	

			text.innerText = 'finish'
		}
		
		const cancelWait = () => {
			sleep.cancel()
		}
		
		main()

	</script>

</html>
2
Plus Pingya 31 अक्टूबर 2019, 04:20