我遇到了一个问题,当尝试在 Safari 中播放音频时,调用永远无法解决resume。AudioContext我正在创建一个AudioContext页面加载,因此它以暂停状态启动。
根据此 chromium 问题,resume如果浏览器的自动播放策略阻止,调用将无法解决。我有一个绑定到 a 的点击事件<button>,如果它被挂起,它将恢复上下文。这适用于 Firefox 和 Chrome,并且如果我更改网站的自动播放设置,也将适用于 Safari。
以下是我通常如何恢复上下文:
await context.resume();
Run Code Online (Sandbox Code Playgroud)
对于 Safari,我尝试在不等待承诺解决的情况下调用resume,而是注册一个回调onstatechange,然后将其包装在Promise:
if (window.webkitAudioContext) {
await new Promise((accept, reject) => {
this.context.onstatechange = async () => {
if ((await this.context.state) === "playing") {
accept();
} else {
reject();
}
};
this.context.resume();
});
}
Run Code Online (Sandbox Code Playgroud)
然而,什么都没有改变:Promise永远不会解决,这意味着上下文状态没有改变。
我错过了什么吗?
我正在使用每个键有两个值的Multimap.下面是我用来分别获取每个值的代码:
第一个代码获取第一个对象值:
for(Object object : map.get(object))
{
return object
}
Run Code Online (Sandbox Code Playgroud)
然后,我正在使用另一种方法来检索其他值.此方法将第一个对象作为参数:
for(Object object : team.get(object))
{
if(object != initialObject)
{
return object;
}
}
Run Code Online (Sandbox Code Playgroud)
这似乎是一种"hackish"做事方式,所以有没有办法让我更容易获得价值?