javascript - ReactJS - 仅在窗口对象(Spotify SDK)上完全加载第三方库时运行 useEffect
问题描述
我正在尝试在组件挂载时初始化 Spotify SDK,并将实例保持在我的 Redux 状态中。因此,在我的 DashboardPage 视图中,我正在运行 useEffect,它调度 connectPlayer 操作来初始化播放器。
问题是它有效,但并非总是如此。它每 1-2 次刷新尝试运行一次。如何确保仅在 window.Spotify 对象可用时才调度此操作?我尝试过使用 if 语句并将其添加到依赖项数组中。
useEffect(() => {
window.onSpotifyWebPlaybackSDKReady = () => {
console.log("ready");
dispatch(connectPlayer());
};
}, []);
这是我的动作创建者:
const playerSlice = createSlice({
name: "player",
initialState,
reducers: {
connectPlayer: state => {
const playerInst = new window.Spotify.Player({
name: "Default Player",
getOAuthToken: cb => cb(localStorage.getItem("access_token")),
volume: 0.2
});
playerInst.addListener("ready", ({ device_id }) => {
console.log("Ready with Device ID", device_id);
});
playerInst.addListener("player_state_changed", state => {
console.log("player_state_changed", state);
});
playerInst.connect();
state.playerInstance = playerInst;
}
}
});
我正在像这样在 public/index.html 中加载 Spotify SDK
<script src="https://sdk.scdn.co/spotify-player.js"></script>
解决方案
useEffect(() => {
window.onload = () => {
window.onSpotifyWebPlaybackSDKReady = () => {
console.log("ready");
dispatch(connectPlayer());
};
}
}, [])
推荐阅读
- ios - XCode 11.6:由于缺少图像而导致的不一致
- bash - 使用 Azure CLI(Cloud Shell-Bash)创建 VM
- php - 发货电话/发货电子邮件发送到新订单电子邮件 WooCommerce
- android - 如何使用颤振构建此屏幕的白色区域?
- selenium - chromedriver 选项的“--disable-extensions”是什么意思?
- python - 如何发出命令以嵌入发送用户个人资料图片?
- javascript - 使用弹出窗口通知用户使用 nodemailer 成功发送电子邮件
- c# - Task.Run(job) 和 job(); 之间有什么不同?等待Task.CompleteTask?
- oauth-2.0 - 当两者都返回用户信息(电子邮件地址等)时,openId Connect 如何是身份验证协议和 OAuth2?
- json - 如何在 JS 中导入 btoa?