Jadi saya membuat semacam permainan, di mana seorang pemain memiliki beberapa powerup. Setelah giliran pemain selesai, harus ada batas waktu 5 detik di server, di mana tidak ada kode yang dieksekusi, dan giliran harus dilewati setelah waktu tersebut. Namun jika klien mengklik salah satu powerup, server harus menghentikan batas waktu 5 detik dan mulai mengeksekusi lagi. Bagaimana saya menerapkan ini?

Saat ini saya menggunakan,

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

Yang berhenti dan menunggu batas waktu berakhir, tetapi bagaimana saya bisa menghentikan batas waktu ketika klien memilih powerUp? Bagaimana cara menghapus batas waktu berdasarkan Janji?

Singkatnya apa yang ingin saya lakukan adalah:

kode sisi server

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

di sisi klien dalam periode ini jika pemain mengklik powerup, itu memberi tahu server tentang acara tersebut dan server dimaksudkan untuk menghentikan batas waktu di atas dan melakukan hal-hal lain

1
Ashok 31 Oktober 2019, 06:09

1 menjawab

Jawaban Terbaik

Solusi saya untuk ini adalah membuat kelas yang mengelola instance Promise dan Timeout.

Beri nama kelas ini Sleep, kelas ini membutuhkan durasi dalam konstruktornya dan menjadwalkan batas waktu pada durasi yang diberikan serta membuat instance janji.

Tambahkan fungsi async wait() yang mengembalikan instance promise sehingga kita dapat mengaktifkan await.

Tambahkan fungsi cancel() yang hanya menyelesaikan instance janji dan menghapus batas waktu.

<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 Oktober 2019, 04:20