Последовательность выполнения JS

89
10 марта 2022, 06:10

Есть такой код JS:

var first = "";
var second = "";
init_vars();
dosomething(first, second);

2 пустые переменные. Функция init_vars(); вносит в них значения.

Затем эти значения передаются в функцию dosomething(first, second).

Основной код конечно не такой, но смысл такой же.

У меня получается что при выполнении переменные остаются пустыми и в функцию dosomething(first, second); они пустыми и попадают.

Если сделать тоже самое в цикле, в первый раз в функцию dosomething(first, second); попадут пустые переменные, но на второй раз в них уже будет информация.

Мой вопрос таков : Как мне добиться "правильной" последовательности исполнения?

Чтобы сначала выполнилась функция init_vars();, данные внеслись в переменные. А уж потом выполнилась функция dosomething(first, second);

Answer 1

Этого уже добились:

var first = ""; 
var second = ""; 
init_vars(); 
for (var i = 0; i < 3; i++) { 
  dosomething(first, second); 
} 
 
function init_vars() { 
  first = "One"; 
  init_vars2(); 
} 
function init_vars2() { 
  second = "Two"; 
} 
function dosomething(first, second) { 
  console.log(first, second); 
}

при первом исполнении цикла ...

Я не вижу в вопросе никакого "цикла".

Answer 2

Есть вариант с проверками через setTimeout, если по какой-то причине изменение значений переменных от вас не зависит:

var first; 
var second; 
 
async_init_vars(); 
 
var attempts = 0; 
setTimeout(function bubu(){ 
  if( ++attempts > 50 ) { 
    // Если уже было много попыток, но значения так и не прилетели - пора остановиться. 
    return console.log("Не дождались переменных first | second"); 
  } 
 
  if( typeof first == "undefined" || typeof second == "undefined" ){ 
    // Если любая из переменных оказывается undefined, повторяем попытку чуть позже 
    console.log("Переменные еще не готовы!"); 
    setTimeout(bubu, 200); 
  } else { 
    // Иначе запускаем основную функцию 
    doSomething(first, second); 
  } 
}, 200); 
 
/******/ 
 
function async_init_vars(){ 
  setTimeout(function asyncExample(){ 
    first = "bubu-1"; 
    second = "bubu-2"; 
  }, 1000); 
} 
 
function doSomething(a, b){ 
  console.log(a, b); 
}

Даже если это у вас сработает (а оно сработает), всё равно костыльненько... Нужно посмотреть код init_vars, и в нем что-то поменять.

READ ALSO
Определять выход дочернего элемента за границы родителя? js (jquery)

Определять выход дочернего элемента за границы родителя? js (jquery)

делаю многоуровневое меню (три уровня), столкнулся с проблемой, что у крайних пунктов, меню вторых третьих уровней выходят за зону видимости...

104
Смена стилей у элементов на странице?

Смена стилей у элементов на странице?

Использую вот такую систему смены стилей по кнопкеОднако не все элементы меняют стили

78