動画のコントローラが表示される実装を以下の通り書いています。
const [secondCall, setSecondCall] = useState(false); let timeoutID; function offVideoControls() { return new Promise(resolve => { resolve(setSecondCall(true)); //setStateを確実に実行するためasyinc/await使用 }); } function callUnified() { if (secondCall) { return new Promise(resolve => { resolve(unified()); }); } } function unified() { clearTimeout(timeoutID); //前回のsetTimeoutを初期化 setSecondCall(false); } async function threeSecondTimeout() { await offVideoControls(); await callUnified(); clearTimeout(timeoutID); timeoutID = setTimeout(function () { setShowVideoControls(false); //ここでコントローラを非表示 }, 3000); } ...略 <View style={{ width: '100%', height: '100%' }}> <TouchableWithoutFeedback onPress={() => { setUpVideoControls(); threeSecondTimeout(); //↑のfunctionを呼び出し }}> <Text style={{ flex: 1, }}> {''} </Text> </TouchableWithoutFeedback> </View>
処理の内容的には
①setTimeoutを消す
②setTimeoutを実行
を実行しているので、何回関数が実行されても前回のsetTimeout
は消え
、毎回一定時間でsetTimeout
が実行されるはずです。
しかし、実際ボタンを連打してみるとsetTimeout
は3秒なのにまばらで実行されます。
コードが安定実行されるように書かれてないためだと思います。
どうすれば{setTimeoutが連打されて実行されても前回の
setTimeoutは消去され、
setTimeout`を通常通りに実行できるでしょうか?
上書きが好ましいと考えています。
お力添えいただきますようお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/04 01:07