【问题标题】:Access const inside async function in react-native / expo在 react-native / expo 中访问异步函数内的 const
【发布时间】:2026-02-16 05:05:02
【问题描述】:

我正在尝试使用expo-av lib

我使用以下异步函数从 URL 播放声音文件:

PlaySound = async (soundURL) => {
    try { 
        const playbackObject = await Audio.Sound.createAsync(
            { uri: soundURL },
            { shouldPlay: this.state.shouldPlay }
        );
     } catch (error) {
           console.log('ERROR:'+error);
           // Error retrieving data
     }

    return playbackObject;
};


stopSound = async (soundURL) => {
try {

  this.setState({shouldPlay:false});
   const playbackObject = await PlaySound(soundURL);

 } catch (error) {
  console.log('ERROR:'+error);
  // Error retrieving data
}
playbackObject.stopAsync(); // this is causing the error
};

我收到此错误:

错误:ReferenceError:找不到变量:playbackObject

[未处理的承诺拒绝:ReferenceError:找不到变量: 播放对象]

PlaySound 函数可以按我的意愿工作。现在我希望能够使用stopSound 函数暂停/停止。 The documentation 说使用soundObject.stopAsync(),在我的情况下是playbackObject。但我不知道如何在函数之外访问这个 const?

谁能指出我正确的方向?

【问题讨论】:

  • 从异步函数中返回它,然后等待返回的承诺。它将解析为播放对象。
  • @Li357 感谢您的回复 - 你能告诉我如何返回它然后在函数之外使用它吗?
  • return playbackObject 在 try 块中,然后在需要对象的地方调用 const playbackObject = await PlaySound(…)。请务必处理 catch 块。
  • @Li357 感谢您的回复 - 我已经更新了我的问题,因为我仍然无法让它工作:(
  • 这是一个类属性。应该是this.PlaySound

标签: javascript react-native expo


【解决方案1】:

您不能在 try catch 之外引用在 try/catch 内部定义的 const。您可以通过执行以下任一操作来解决此问题:

let playbackObject;

try { 
  playbackObject = await Audio.Sound.createAsync(
    { uri: soundURL },
    { shouldPlay: this.state.shouldPlay }
  );
} catch (error) {
  console.log('ERROR:'+error);
  // Error retrieving data
}

return playbackObject;

try { 
  return Audio.Sound.createAsync(
    { uri: soundURL },
    { shouldPlay: this.state.shouldPlay }
  );
} catch (error) {
  console.log('ERROR:'+error);
  // Error retrieving data
}

为了修复 stop 函数,您应该维护一个对由 start 函数返回的播放对象的引用,并在 stop 函数中使用它,因为您当前拥有它的方式会创建一个新的音频流,您将然后停止(保留原件)。

【讨论】:

  • 您好,非常感谢您的回答。我对异步函数非常陌生,无法理解如何使用 .stopAsync(); - 你回答有效,但你能告诉我如何将此值返回值分配给新变量并应用 newVariable.stopAsync(); ?我基本上是在尝试构建一个播放/暂停按钮,但这让我整天都处于等待状态
  • 抱歉,我好像一开始就看错了你的问题,我已经添加了一个编辑,如果有帮助请告诉我。
  • 谢谢,这对我帮助很大。我发现我还必须重组我的代码,因为在运行函数时,promise 从未准备好。这在 react-native 中的 render() 函数内部使用对象时效果更好。