Заметил, что JavaScript работает как-то ассинхронно, и иногда выходит из тела функции, и не хочет возвращать значение. Допустим если написать что-то в таком духе, я значение "1" не дождусь, но вылезит пустой alert, ну или браузер может заморозиться:

Код:
function set_items() {
  var el = document.getElementById('div_inner');
  for(var i=0; i<5000; i++) {
     el.innerHTML += '<div>'+ i + '</div>';
  }
  return 1;
}

window.onload = () => { 
  alert(set_items());
}

Сделал типа такого, вроде работает:

Код:
function set_items(cb) {
  var el = document.getElementById('div_inner');
  for(var i=0; i<5000; i++) {
     el.innerHTML += '<div>'+ i + '</div>';
  }
  cb(1);
}

window.onload = () => { 
  set_items(function(i) { alert(i); } );
}

А теперь давайте попробуем это переписать, но спомощью промисов, тут работает так, поставил обработчик, код дальше выполняется, когда дождётся, сработает await:

Код:
<html>
<head>
<script>
async function set_items() {
  var promise = new Promise((resolve, reject) => {
    var el = document.getElementById('div_inner');
    for(var i=0; i<5000; i++)  el.innerHTML += '<div>'+ i + '</div>';

    resolve(1);
  });
  var result = await promise;
  alert(result);
}

window.onload = () => {
  set_item();
}

</script>
</head>
<body>
  <div id="div_inner"></div>
</body>
</html>