javascript - 为什么一次播放所有声音而不是一次播放一个?
问题描述
所以我正在尝试制作一个生成音乐的应用程序,但我似乎无法弄清楚如何一次只播放一种声音。当我单击生成按钮时,它会一次播放所有声音,而不是一次播放一个。这是我的代码:
var melody_notes = [A3, A4, A5, A6, B3, B4, B5, B6, C3, C4, C5, C6, D3, D4, D5, D6, E3, E4, E5, E6, F3, F4, F5, F6, G3, G4, G5, G6];
function generate() {
for (var a = 0; a < 100; a++) {
for (var i = 0; i < 1; i++) {
var pick = Math.floor(Math.random() * melody_notes.length);
var note = new Audio(melody_notes[pick]);
note.play();
}
}
}
所以上面的列表是声音文件,然后它会随机选择一个并播放它。第一个 for 循环是歌曲中的音符数量,内部 for 循环是一起播放的音符数量。但是当我按下激活该功能的按钮时,会立即播放所有音符。有没有办法解决这个问题?
解决方案
你可以创建一个 Promise 并在前一个声音解决时开始下一个声音。
const audios = [
'https://dl.dropboxusercontent.com/s/1cdwpm3gca9mlo0/kick.mp3',
'https://dl.dropboxusercontent.com/s/h2j6vm17r07jf03/snare.mp3',
'https://dl.dropboxusercontent.com/s/1cdwpm3gca9mlo0/kick.mp3',
'https://dl.dropboxusercontent.com/s/h2j6vm17r07jf03/snare.mp3'
];
async function playSounds(arr) {
for (let i = 0; i < arr.length; i++) {
await new Promise((resolve) => {
sound = new Audio(arr[i]);
sound.onended = resolve;
sound.play();
});
}
}
<button onclick="playSounds(audios);">play</button>
推荐阅读
- firebase - 如何仅获取没有数据的文档ID?(移动的)
- java - 获取迷宫中的所有路径(仅限水平/垂直移动)
- kubernetes - Kubernetes 中没有 AWS 卷但“绑定”PVC
- javascript - 如何在javascript中的两个输入之间留一个空格?
- node.js - 如何将 sitemap.xml 文件上传到 Heroku?
- python - 您如何在 BeautifulSoup 的 for 循环中使用 .find 正确过滤链接?
- selenium - 如何使用 Selenium Webdriver Python 跳过身份验证弹出窗口
- python - Geopandas - ValueError:无法转换幼稚的几何图形。请先在对象上设置 crs
- java - 推荐用于表类数据和随机(索引)读取访问的 Java(或 Kotlin)序列化格式?
- typescript - 用于前端和后端的打字稿导入/导出