Я создаю приложение с expo, которое содержит c музыкальный секвенсор. Это означает, что события (воспроизведение звуков) должны происходить точно во времени (т.е. каждые 1000 мс или 500 мс и т. Д. c). Прямо сейчас я использую setTimeout в al oop, но этого явно недостаточно для задачи, поскольку JS работает в одном потоке, и даже задержка в несколько мс между событиями взрывает все это. Мой текущий код выглядит следующим образом - проверяет, какие звуки были установлены как «Активные» в определенной «доле», а затем соответственно проходит и воспроизводит «активные».
const wait = (ms) => {
return new Promise(resolve => {
setTimeout(resolve, ms);
});
}
const loop = async() => {
for (var i = 1; i <= 8; i++) {
switch (true) {
case beat[i].hat && beat[i].kick && beat[i].snare:
playHat()
playSnare()
playKick()
break;
case beat[i].snare && beat[i].kick:
playSnare()
playKick()
break;
case beat[i].hat && beat[i].kick:
playHat()
playKick()
break;
case beat[i].hat && beat[i].snare:
playHat()
playSnare()
break;
case beat[i].hat:
playHat()
break;
case beat[i].snare:
playSnare()
break;
case beat[i].kick:
playKick()
break;
}
await wait(1000);
}
}
loop();
}
Мои исследования до сих пор кажется, что фоновые задачи в WebView могут быть лучшим способом go, поскольку функции таймера могут работать в независимом потоке, но я не совсем уверен, как сделать это с точки зрения пользовательского интерфейса. Мне интересно, есть ли здесь альтернативные решения, в основном я хочу запустить функцию тайм-аута в al oop с минимальной задержкой / без задержки. Любые мысли приветствуются!