У меня есть рабочий код ниже, но я чувствую, что должно быть более чистое решение, и я не думаю, что обещание или обратный вызов будут работать в моем случае.
У меня есть одна основная функция (foo), которая самостоятельно вызывает себя через x миллисекунд (в моем реальном коде она делает это многократно). Когда он вызывает сам себя, он увеличивает значение, хранящееся в объекте.
У меня есть вторая функция (бар), которая иногда вызывается случайным образом. Однако я бы хотел (в некоторых случаях) иметь возможность приостановить выполнение этой функции до следующего вызова главной функции (foo).
В моем рабочем примере ниже, bar
сохраняет текущее значение prop
при вызове bar
, а затем продолжает проверять значение prop
несколько раз, пока значение не изменится. Когда значения больше не ==, bar
выполняет код в else
. Это работает, но не чисто, и время не так точно, как могло бы быть, если бы bar
просто прослушал изменение prop
(или foo
, который будет вызван), и было выполнено в тот момент.
Я не верю, что обещание или обратный вызов будут работать, потому что они обычно используются в случаях, когда вторая функция передается в качестве аргумента. В моем случае моя вторая функция - это та, у которой есть другая работа, и она уже много раз выполняет свою собственную работу. Я также не хочу, чтобы вторая функция выполнялась снова, я просто хочу, чтобы ее вызов позволял первой функции завершить свое собственное выполнение.
Использование задержки также не идеально для моего реального случая.
Подробнее
Моя настоящая программа создает музыку путем случайного запуска аудио файлов для воспроизведения. bar()
- это функция, которая определяет все способы / свойства воспроизведения звука (длительность, громкость, постепенное увеличение / уменьшение и т. Д.).
foo()
- это основная функция, которая определяет, в какую часть песни входит программа. Поэтому каждый раз, когда вызывается foo()
, она увеличивает, на какой стадии находится программа / песня (т. Е. 1, 2, 3, 4) и также вызывает ряд функций, обновляющих свойства, которые изменяют то, как функциям get()
разрешено воспроизводить звуки.
Итак, программа в основном воспроизводит звуки случайным образом (например, не на жестких битах / тактах), и я хочу иметь возможность воспроизводить их на тактах в некоторых случаях. Поскольку foo()
- это функция, которая отслеживает это время, я добавил функциональность к get()
, так что когда звук не запускается при ударе, он задерживается до тех пор, пока не произойдет назначенный удар, и затем ему будет разрешено играть. У меня эта функциональность работает.
Трюк срабатывает, когда звук назначен на удар, который уже прошел. В этих случаях мне нужно сделать паузу get()
до следующего бара (т.е. когда снова вызывается foo()
). В обычных музыкальных случаях время (количество ударов в минуту) будет фиксированным, чтобы я мог просто выполнить математику и настроить его на время до правильного времени. Но моя программа немного нетрадиционна, и продолжительность меняется каждый раз, когда вызывается foo()
. Таким образом, продолжительность следующего бара не известна заранее.
Итак, подведем итог: bar()
(звук) вызывается с целым набором сохраненных параметров, определяющих, как будет воспроизводиться звук. И мне нужно bar()
сделать паузу после того, как он был вызван, пока он не услышит / не увидит, что foo()
был вызван снова, и только тогда он завершает свою работу по воспроизведению звука.
Вот мой рабочий пример.
const config = {
object: {
prop: 1
},
};
(function foo() {
setTimeout(function() {
config.object.prop = 3;
console.log('foo changed the value of config.object.prop');
}, 4000);
})();
bar();
function bar() {
var prop = config.object.prop;
(function nar() {
if (prop == config.object.prop) {
console.log('sorry, still waiting for config.object.prop to change');
setTimeout(function() {
nar();
}, 1000);
} else {
console.log('Executed only after config.object.prop changed!!!');
}
})();
}