【问题标题】:Using Spotify Web Playback SDK with React将 Spotify Web Playback SDK 与 React 结合使用
【发布时间】:2018-05-18 05:11:08
【问题描述】:

Spotify 在测试版中有一个新功能,支持在浏览器中播放完整的歌曲,即 Web Playback SDK。该文档显示了使用主 HTML 文件中的脚本标签立即初始化播放器的示例。这需要立即在脚本中设置访问令牌。我的问题是我正在创建一个 React 应用程序,并且我只想在用户单击一个按钮登录到他们的 Spotify 帐户时初始化一个播放器。为了仅在此事件发生时加载脚本,我正在使用 react-load-script。我想要的流程是:用户单击一个按钮登录到他们的 Spotify 帐户,一旦他们的登录由 Spotify 验证,我的应用程序就会收到访问令牌,然后加载网络播放脚本,一旦加载脚本,就会调用回调函数并使用访问令牌初始化播放器。

问题是Spotify对象在spotify-player脚本被加载之前是不存在的。当handleScriptLoad回调被实际调用时,Spotify对象是被定义的,但是当代码被编译时,它并不存在。有谁知道如何解决这个问题?

来自相关 React 组件的代码示例:

import Script from 'react-load-script'

...

handleScriptLoad = () => {
const token = this.props.tokens.access
const player = new Spotify.Player({      // Spotify is not defined until 
  name: 'Spotify Web Player',            // the script is loaded in 
  getOAuthToken: cb => { cb(token) }
})

player.connect()
}

...

在我的 React 组件的渲染方法中:

<Script 
  url="https://sdk.scdn.co/spotify-player.js" 
  onError={this.handleScriptError} 
  onLoad={this.handleScriptLoad}
/>

【问题讨论】:

标签: javascript reactjs spotify dynamic-script-loading


【解决方案1】:

理论上是可以的。

Web Playback SDK 将通过外部脚本在我们的 SDK 中异步加载 window.Spotify 对象。所以,等待对象被定义应该可以解决问题:

handleScriptLoad = () => {
  return new Promise(resolve => {
    if (window.Spotify) {
      resolve();
    } else {
      window.onSpotifyWebPlaybackSDKReady = resolve;
    }
  });
}

这应该可以解决您的问题。

【讨论】:

  • 感谢 Bilawal Hameed!我实际上只是通过将播放器定义为 window.Spotify.Player 而不是 Spotify.Player 来解决这个问题。这实际上忽略了该窗口。在加载脚本之前,Spotify 是未定义的,并且运行了 handleScriptLoad 函数。
  • 有趣。这不会引发错误,因为 window.Spotify 将是 undefined 并且您正在尝试对其调用方法?
  • 它不会抛出错误。显然Player 方法在编译时没有得到检查,所以Spotify 最初是undefined 并不重要。
  • SDK 定义了window.Spotify.Player,所以每当我们调用Spotify.Player 时,它都会尝试在本地和全局上查找它。一旦 SDK 加载,它将被全局定义。这两者应该是同义词,除非你在本地覆盖了它。
  • 我同意,但是由于某种原因,当它被定义为Spotify.Player 时它无法编译,但是当它被定义为window.Spotify.Player 时它工作正常。我唯一的猜测是,在编译时它没有检查 Player 实际上是 Spotify 上的一个方法,只是 Spotify 是一个有效的对象。无论如何,我最终使用了您提供的解决方案,因为它更强大并且我实际上理解它,感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2018-07-19
  • 1970-01-01
  • 2019-06-25
  • 2020-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多