我正在扩展计时器组件的功能,以便为计时器的最后 3 秒添加beep
声音。效果很好,问题毕竟是说完了。我正在执行以下操作:
- 将计时器组件包装在新的功能组件上
Audio.Sound()
在组件的主体中初始化- 最初
useEffect
用于加载声音 - 在每个计时器事件中,我检查是否应该播放声音并使用
replayAsync
- 在
useEffect
清理时我卸载声音对象unloadAsync
在最后一次哔声播放后大约一秒钟并且我导航到以下屏幕,我收到一个错误,我将在下面完整地过去。似乎 expo-av 库对我的声音对象调用了查找操作,但我的组件不再存在:
[Unhandled promise rejection: Error: Seeking interrupted.]
我尝试了以下但没有成功:
- 拨打电话
loadAsync
和unloadAsync
等待电话 - 试图为
setOnPlaybakStatusUpdate
null 以尝试阻止 statusUpdate 调用 - 我什至试图不通过卸载声音
unloadAsync
我的代码是:
import React from 'react'
import CountDown from 'react-native-countdown-component'
import { Audio } from 'expo-av'
const BEEP_START = 3
const CountDownBeep = (props) => {
console.log('Sound Created')
const beepSound = new Audio.Sound()
React.useEffect(() => {
async function loadSound() {
console.log("Sound Initialized")
await beepSound.loadAsync(require('../assets/sounds/beep.wav'), {
shouldPlay: false,
isLooping: false,
})
// This is not by design, just one of my attempts to get rid of the error
beepSound.setOnPlaybackStatusUpdate()
}
loadSound()
// Cleanup, tried with async and without
return async () => {
console.log('Sound destroyed')
await beepSound.unloadAsync()
}
})
const countDownTimerChangedHandler = (timeLeft) => {
// This works fine
if (timeLeft <= BEEP_START + 1 && timeLeft > 0) {
console.log('Sound Played:', timeLeft)
beepSound.replayAsync()
}
}
return (
<CountDown
{...props}
onChange={(timeLeft) => countDownTimerChangedHandler(timeLeft)}
/>
)
}
export default CountDownBeep
功能是 100%,但是在我导航到下一个屏幕后几毫秒或一两秒后,我收到以下错误:
[Unhandled promise rejection: Error: Seeking interrupted.]
- node_modules/react-native/Libraries/BatchedBridge/NativeModules.js:103:50 in promiseMethodWrapper
- node_modules/@unimodules/react-native-adapter/build/NativeModulesProxy.native.js:15:23 in moduleName.methodInfo.name
- node_modules/expo-av/build/Audio/Sound.js:138:24 in replayAsync
- node_modules/expo-av/build/Audio/Sound.js:5:33 in <anonymous>
- node_modules/regenerator-runtime/runtime.js:63:36 in tryCatch
- node_modules/regenerator-runtime/runtime.js:293:29 in invoke
- node_modules/regenerator-runtime/runtime.js:63:36 in tryCatch
- node_modules/regenerator-runtime/runtime.js:154:27 in invoke
- node_modules/regenerator-runtime/runtime.js:189:16 in PromiseImpl$argument_0
- node_modules/promise/setimmediate/core.js:45:6 in tryCallTwo
- node_modules/promise/setimmediate/core.js:200:22 in doResolve
- node_modules/promise/setimmediate/core.js:66:11 in Promise
- node_modules/regenerator-runtime/runtime.js:188:15 in callInvokeWithMethodAndArg
- node_modules/regenerator-runtime/runtime.js:211:38 in enqueue
- node_modules/regenerator-runtime/runtime.js:238:8 in exports.async
- node_modules/expo-av/build/Audio/Sound.js:5:33 in <anonymous>
- node_modules/expo-av/build/Audio/Sound.js:5:33 in <anonymous>
- node_modules/regenerator-runtime/runtime.js:63:36 in tryCatch
- node_modules/regenerator-runtime/runtime.js:293:29 in invoke
- node_modules/regenerator-runtime/runtime.js:63:36 in tryCatch
- node_modules/regenerator-runtime/runtime.js:154:27 in invoke
- node_modules/regenerator-runtime/runtime.js:189:16 in PromiseImpl$argument_0
- node_modules/promise/setimmediate/core.js:45:6 in tryCallTwo
- node_modules/promise/setimmediate/core.js:200:22 in doResolve
- node_modules/promise/setimmediate/core.js:66:11 in Promise
- node_modules/regenerator-runtime/runtime.js:188:15 in callInvokeWithMethodAndArg
- node_modules/regenerator-runtime/runtime.js:211:38 in enqueue
- node_modules/regenerator-runtime/runtime.js:238:8 in exports.async
- node_modules/expo-av/build/Audio/Sound.js:5:33 in <anonymous>
* components/CountDownBeep.js:31:24 in countDownTimerChangedHandler
* components/CountDownBeep.js:39:22 in CountDown.props.onChange
- node_modules/react-native-countdown-component/index.js:115:21 in CountDown#updateTimer
- node_modules/react-native/Libraries/Core/Timers/JSTimers.js:135:14 in _callTimer
- node_modules/react-native/Libraries/Core/Timers/JSTimers.js:387:16 in callTimers
- node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:425:19 in __callFunction
- node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:112:6 in __guard$argument_0
- node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:373:10 in __guard
- node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:111:4 in callFunctionReturnFlushedQueue
* [native code]:null in callFunctionReturnFlushedQueue