Estoy usando Expo-AV para reproducir un sonido cuando cargo la pantalla usando componentDidMount , dado que el audio no es muy largo, quiero reproducirlo en bucle hasta que el usuario presione un botón para detenerlo, el audio comienza correctamente pero cuando comienza para repetir el audio ya no se detiene.
(Tengo otra función en fetchNewOrder que necesito seguir ejecutando, por eso no quiero detener el intervalo)
Esta es la documentación que estoy siguiendo: https://docs.expo.dev/versions/v44.0.0/sdk/av/
export class App extends Component { constructor(props) { super(props); this.state = { sound: null, }; } async componentDidMount() { this.updateTimer = setInterval(() => { this.fetchNewOrders(); }, 10000); } fetchNewOrders = async () => { const { sound } = await Audio.Sound.createAsync(require('../../../assets/ringtone2.mp3')); this.setState({sound: sound}); this.playSound() } playSound = async () => { await this.state.sound.playAsync() await this.state.sound.setIsLoopingAsync(true) }; stopSound = async () => { await this.state.sound.stopAsync() await this.state.sound.unloadAsync() } render() { return( <View> <Button onPress={this.stopSound} /> </View> ) } }Para detener el bucle setInterval , debe llamar a clearInterval(idOfSetInterval) . setInterval devuelve una identificación.
this.updateTimer = setInterval(() => { this.fetchNewOrders(); }, 10000); console.log(this.updateTimer) updateTimer es una identificación y una llamada en stopSound clearInterval .
stopSound = async () => { clearInterval(this.updateTimer) }