λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Javascript

πŸ¦˜λΉ„λ””μ˜€ μžλ™μž¬μƒ μ‹€ν–‰μ‹œν‚€κΈ°

by frontChoi 2023. 7. 2.
λ°˜μ‘ν˜•

πŸ… λΉ„λ””μ˜€ μ •μ±…

ν¬λ‘¬μ΄λ‚˜ μ‚¬νŒŒλ¦¬λ“± μ‚¬μš©μžμ˜ μ•‘μ…˜μ—†μ΄ λΉ„λ””μ˜€λ₯Ό μžλ™μž¬μƒ μ‹œν‚¬ μˆ˜λŠ” μ—†λ‹€. λ‹€λ§Œ μžλ™μž¬μƒμ΄ ν•„μš”ν•œ κ²½μš° μŒμ†Œκ±° μ²˜λ¦¬ν•˜λ©΄ 
 μžλ™μ‹€ν–‰μ΄ κ°€λŠ₯ν•˜λ‹€
 κ·ΈλŸ¬λ‚˜ ν˜„μž¬ μ„œλΉ„μŠ€μ—μ„œλŠ” ν•­μƒ μžλ™μž¬μƒμ„ μ›ν•˜μ˜€λ‹€. λ‹€λ§Œ ν•­μƒ μžλ™μž¬μƒμ„ ν•  μˆ˜ μ—†λ‹€κ³  μ „λ‹¬ν•˜μ˜€κ³ , μžλ™μž¬μƒμ΄ μ•ˆλ  κ²½μš° alert을 λ„μ–΄μ£ΌκΈ°λ‘œ ν•˜μ˜€λ‹€

 

🦬 μžλ™μž¬μƒ μ‹œλ„

μ—¬μ „νžˆ μ‚¬μš©μž μ•‘μ…˜μ—†μ΄λŠ” μžλ™μž¬μƒμ΄ κ±°μ˜λΆˆκ°€λŠ₯ ν•˜μ§€λ§Œ μ‹œλ„ ν•  μˆ˜ μžˆλŠ” λ°©λ²•이 μ‘΄μž¬ν•œλ‹€. 3νšŒμ— κ±Έμ³ κ°•μ œλ‘œ playλ₯Ό ν•˜λŠ”κ²ƒμ΄λ©°,
μ•ˆλ κ²½μš° alert으둜 μ‚¬μš©μžκ°€ μž¬μƒλ²„νŠΌμ„ λˆ„λ₯΄λ„둝 μœ λ„ν•œλ‹€.

 

🐘 μžλ™μž¬μƒ μ‹œλ„ - script

일단 video retryλ₯Ό Promise ν˜•νƒœλ‘œ return ν•œλ‹€.

 

/* promise retry video*/
		const videoPromiseRetry = (retryCount = 3) => {
			return new Promise((resolve, reject) => {
				const retry = (attempt = 0) => {
					const promise = video.play();
					promise
						.then(() => {
							resolve('videoPromiseRetry success')
						})
						.catch(error => {
							console.error("videoPromiseRetry error : ", error);
							if (attempt < retryCount) {
								console.error(`μž‘μ—…μ„ μž¬μ‹œλ„ ν•©λ‹ˆλ‹€. 남은 횟수 : ${retryCount - attempt}`);
								setTimeout(() => retry(attempt + 1), 1000)
							}
							else {
								const error = new Error('μž‘μ—…μ„ μ‹€νŒ¨ν•˜μ˜€μŠ΅λ‹ˆλ‹€.')
								error.name = 'FailRetry';
								reject(error)
							}

						})
				}

				retry(0)

			})
		}

 

그리고 video의 이벀트 쀑 "canplaythrough" κ°€ νŠΈλ¦¬κ±°κ°€ λœλ‹€λ©΄, ν•¨μˆ˜λ₯Ό 호좜 ν•˜κ³  3νšŒμ— 걸쳐 μžλ™μž¬μƒμ΄ μ‹€νŒ¨ν•  경우 catchλΆ€λΆ„μ—μ„œ μ²˜λ¦¬ν•˜λ„λ‘ ν•œλ‹€.

 

const videoAddEvent = () => {
	video.addEventListener("canplaythrough", eventHandle);
}

const eventHandle = (evt) => {
	const { type } = evt;
    
    switch (type) {
    	case 'canplaythrough':
        	videoPromiseRetry()
                .then(result => {
                    console.log("result :", result);
                    initialPlay = false;
                })
                .catch(err => {
                    if (err.name === 'FailRetry') {
                        alert("μž¬μƒλ²„νŠΌμ„ ν΄λ¦­ν•΄μ£Όμ„Έμš”")
                    }
                    else {
                        alert("κ΄€λ¦¬μžμ—κ²Œ λ¬Έμ˜ν•΄μ£Όμ„Έμš”")
                    }
                    console.error("videoPromiseRetry error : ", err.name);
                })
        	break;
    	default:
			break;
    }
}

 

λ°˜μ‘ν˜•

λŒ“κΈ€