Как зациклить функцию? Нужно повторять функцию (в принципе сгодится даже с теми же самыми аргументами), пока не получим необходимый результат. Вот кривой нерабочий код для примера, как то так оно выглядит в моеих влажных фантазиях. Подскажите, пожалуйста, как выпрямить?function a(callback){ // некая асинхронная функция с колбэком setTimeout(function(){ var random = Math.random() console.log(random); callback(random); }, 1000); } function b(lap){ // нужно выполнять a() до получения // результата но не более 10 раз a(function(r){ if(r<0.05 && lap<10) b(lap+1); }); } b(0); // поехали, круг - 0 // в итоге получаем только один цикл :(
Вы можете создать замыкание (closure), чтобы хранить состояние количества выполненных кругов, и затем использовать цикл while для повторного выполнения функции a до получения нужного результата или достижения максимального количества кругов.
Вот пример исправленного кода:
function a(callback){ // некая асинхронная функция с колбэком setTimeout(function(){ var random = Math.random(); console.log(random); callback(random); }, 1000); } function b(){ let lap = 0; let result = (random) => { if(random >= 0.05 || lap >= 10) return; a(function(r){ lap++; result(r); }); } result(null); } b(); // поехали, круг - 0
В этом коде мы используем замыкание для хранения значения переменной lap и функции result, которая вызывает себя же рекурсивно до тех пор, пока не будет получен результат больше либо равного 0.05 или пока количество кругов не достигнет 10.
Вы можете создать замыкание (closure), чтобы хранить состояние количества выполненных кругов, и затем использовать цикл while для повторного выполнения функции a до получения нужного результата или достижения максимального количества кругов.
Вот пример исправленного кода:
function a(callback){ // некая асинхронная функция с колбэкомsetTimeout(function(){
var random = Math.random();
console.log(random);
callback(random);
}, 1000);
}
function b(){
let lap = 0;
let result = (random) => {
if(random >= 0.05 || lap >= 10) return;
a(function(r){
lap++;
result(r);
});
}
result(null);
}
b(); // поехали, круг - 0
В этом коде мы используем замыкание для хранения значения переменной lap и функции result, которая вызывает себя же рекурсивно до тех пор, пока не будет получен результат больше либо равного 0.05 или пока количество кругов не достигнет 10.