他对我来说很有意义,所以我试着做一个 setTimeout 像..
这更像是一个快速修复,但很棘手,因为您不确定是否所有内容都已加载。
解决方案是等到每个样本都加载完毕。最好的方法是为此使用Promises,但这需要(大型)重构并且与所有当前浏览器不兼容(因此您需要Babel或Typescript等)。
所以我采用了一种更简单的方法:对于每个样本,我都创建了一个boolean
变量,该变量将true
在加载完成时设置为(在回调函数中)
var loadedHat = false;
var loadedSnare = false;
var loadedBd = false;
loadSample('cl_hat_3001.wav', function (buffer) {
hat = buffer;
loadedHat = true;
startWhenAllLoaded();
});
loadSample('brp_snrim1.wav', function (buffer) {
snare = buffer;
loadedSnare = true;
startWhenAllLoaded();
});
loadSample('bd08.wav', function (buffer) {
bd = buffer;
loadedBd = true;
startWhenAllLoaded();
});
然后我将您的代码包装在一个start
函数中并制作了一个startWhenAllLoaded
,它在所有树布尔值都是true
function startWhenAllLoaded()
{
if(!started && loadedHat && loadedSnare && loadedBd){
started = true;
start();
}
}
编辑后的 codepen 在这里
注意:不确定现在是否一切正常,错误消失了,但我认为代码需要一些调整