代码正在运行好,但是我敢肯定有一种更有效的方法来执行此操作。目前,它在Firefox中可以正常工作,但在Chrome中却无法解决。在相距110ms的每个步骤中检查布尔值,并且数组中的项目是true还是false的结果确定声音是否被触发(对于该数组是唯一的)。当Chrome出现峰值时,代码中的某些信息会堆积起来,这会导致各种故障和泄漏……我似乎无法找出一种方法将这些全部捆绑到每个循环中进行一次检查,而不是运行所有这些{{ 1}}语句。有可能吗?
if
如果var loop = [{
"sound": "one",
"pattern": [true, false, false, false],
"volume": 100
},{
"sound": "two",
"pattern": [false, true, false, true],
"volume": 100
},{
"sound": "three",
"pattern": [true, true, true, true],
"volume": 100
}]
var s = 0;
function startLoop(){
if (playing === true){
setTimeout(function(){
if (typeof loop[0] !== "undefined") {
if (loop[0].pattern[s] === true){
soundset.play(loop[0].sound);
}
}
if (typeof loop[1] !== "undefined") {
if (loop[1].pattern[s] === true){
soundset.play(loop[1].sound);
}
}
if (typeof loop[2] !== "undefined") {
if (loop[2].pattern[s] === true){
soundset.play(loop[2].sound);
}
}
s++;
if (s < loop[0].pattern.length){
startLoop();
} else {
s = 0;
startLoop();
}
}, 110)
} else {return;}
};
上方的循环不存在,则typeof loop[x] !== "undefined"
就位。该计划原本大约要运行10个,但是这种检查每个步骤的方法却只有三个。
答案 0 :(得分:1)
尝试一下:
var loop = [
{
"sound": "one",
"pattern": [true, false, false, false],
"volume": 100
},{
"sound": "two",
"pattern": [false, true, false, true],
"volume": 100
},{
"sound": "three",
"pattern": [true, true, true, true],
"volume": 100
}
];
var s = 0;
function startLoop(){
if (playing !== true)
return;
setTimeout(function(){
for(const i in loop){
if(loop[i].pattern.hasOwnProperty(s)){
if(loop[i].pattern[s]){
soundset.play(loop[i].sound);
}
}else{
s = 0;
}
}
s++;
startLoop();
}, 110);
};
答案 1 :(得分:1)
forEach()
,而不是对loop[0], loop[1], etc…
进行硬编码。这样一来,您就可以拥有无穷无尽的乐器。 loop
对象.audio
中)。 true
和false
代替0
和1
来简洁地指示 boolean 值。 0.0
到1.0
%
环回0
您的股票代码索引。
s