как работает функция asyn c в javascript? - PullRequest
0 голосов
/ 17 апреля 2020

Допустим, есть две функции asyn c:

async function asyncCall() {
  for(var i=0;i<50000;i++){
     console.log('1');
  }
}
async function asyncCall2() {
  for(var i=0;i<5;i++){
    console.log('2');
  }
}

И я вызываю обе функции:

asyncCall();
asyncCall2();

Это вывод:

Output

1 50 000 раз, затем 2 один раз.

Не следует ли регистрировать 2 где-то между 50 000 и 1 разом?

1 Ответ

0 голосов
/ 19 апреля 2020

Нет потоков в JavaScript. Поскольку весь ваш код выполняется только в одном потоке js, ожидается вывод.

Ваше неправильное представление о async довольно распространено. Вы думаете, что async подразумевает некоторую «фоновую работу», но это не так! В asyn c нет потока ! Внутри функции asyn c вы можете просто сказать: «Я сделал то, что хочу, но знаю, что мне нужно подождать ... может, позже я смогу продолжить ... вы можете заставить поток делать другие вещи». Но если начался другой материал, то этот другой выполняется до тех пор, пока он не будет выполнен (или снова вернет поток).

Чтобы получить ожидаемый результат, вам нужно будет вернуть выполнение к остальной части кода из внутри функции - но тем не менее он не является многопоточным и, следовательно, если получен ожидаемый результат, он не будет обработан, пока не будет выполнен текущий выполняемый код.

function resolveAfter2Seconds() {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve('resolved');
    }, 2000);
  });
}

async function asyncCall() {
  console.log('calling');
  const result = await resolveAfter2Seconds(); // we will wait and during that time the single thread executing our code can do other stuff
  console.log(result);
  // expected output: 'resolved'
}

function fnCall2() {
  console.log('fn2');
  for(var i=0;i<500;i++) { // this will not be interrupted!
     console.log(i);
  }
}

asyncCall();
fnCall2();

Результат asyncCall будет получен через 2 секунды , но это не значит, что он обрабатывается немедленно. Если fn2 требуется больше времени, чем обработка результата задерживается. Попробуйте установить для fn2 значение 50000 - после этого сообщение resolve всегда будет печататься.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...