0

Как получить доступ к переменной Itemlength за пределами функции xhr.onload в XMLHttpRequest запросе? Чтобы я мог использовать ее в цикле, для изменения параметров url в этом коде:

<script>
    let xhr = new XMLHttpRequest();
    for (let start = 0; Itemlength < 100; start += 100 ){
    let url = 'https://iss.moex.com/iss/engines/stock/markets/shares/boards/TQBR/securities/SBER/candles.json?interval=24&start='+start;
    xhr.open('GET', url);
    xhr.send();
    xhr.onload = function () {
      let responseObj = xhr.response;
      let jsparse = JSON.parse(responseObj);
      let Itemlength = jsparse['candles']['data'].length;
            }
    }
</script>

Также и в Fetch запросе. Как можно получить доступ к Itemlength за пределами .then ?

<script>    fetch('https://iss.moex.com/iss/engines/stock/markets/shares/boards/TQBR/securities/SBER/candles.json')
      .then((response) => {
        return response.json();
      })
      .then((data) => {
       let Itemlength = data['candles']['data'].length;
       console.log(Itemlength);
         });
</script>
  • Просто так это сделать не получится, это следствие асинхронности. См. подробности здесь: https://ru.stackoverflow.com/questions/554290/ и здесь: https://learn.javascript.ru/async – vsemozhebuty Jan 19 '21 at 16:20

1 Answers1

0

Можно использовать асинхронную функцию, если старые браузеры не нужны:

(async ()=>{
    for (let start = 0, Itemlength = 0; Itemlength < 100 && start < 1000; start += 100 ){
      let url = 'https://iss.moex.com/iss/engines/stock/markets/shares/boards/TQBR/securities/SBER/candles.json?interval=24&start=' + start;
      let response = await fetch(url);
      let data = await response.json();
      let Itemlength = data['candles']['data'].length;
      console.log(`start: ${start}, Itemlength ${Itemlength}`);
    }
})();