Что именно происходит в ожидании обещания в JavaScript? - PullRequest
2 голосов
/ 27 мая 2019

Одна вещь, которую я не могу найти нигде в документации или связанных ресурсах, это что такое процедура в отношении вызывающей функции и цикла обработки событий, когда JS достигает ключевого слова await.

Вот что такое состояние specs :

Выражение await заставляет выполнение асинхронной функции приостанавливаться до разрешения Promise, которое выполняется или отклоняется, и довозобновить выполнение асинхронной функции после выполнения.При возобновлении значение выражения await равно значению выполненного Обещания.

Это все имеет смысл, но что на самом деле означает пауза?Возвращается ли функция немедленно вызывающей стороне, а затем, когда ожидаемое обещание разрешается, оно и остальная часть асинхронного метода добавляются в очередь для выполнения микрозадач?Я знаю, что async/await является синтаксическим сахаром для API Promise, поэтому я предполагаю, что это именно то, что происходит, но я хочу убедиться, что я действительно понимаю «магию», которая происходит, когда достигается await,

Из того, что я прочитал, похоже, что это сделано в C #, но я не совсем уверен, как это переводится в JS.

Ответы [ 2 ]

4 голосов
/ 27 мая 2019

В точности как вы сказали, она помещает оставшуюся часть функции в микро-задачу Q и возвращает основную функцию.

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

Что помогает мне понять, так это преобразовать асинхронную / ожидающую в синтаксис обещания, и тогда она становится понятной.

Например:

async function doSomthing() {
  someSync();

  const result1 = await someAsync();
  const result2 = await someAsync2();

  return result1 + result2;
}

"преобразует" в:

function doSomthing() {
  someSync();

  return someAsync().then(result1 => {
    return someAsync2().then(result2 => {
      return result1 + result2;
    });
  });
}

Как видите, doSomthing немедленно возвращает обещание.

0 голосов
/ 27 мая 2019

await / async означает, что мы выполняем код синхронно.Он будет следовать порядку вызова функции await внутри асинхронной функции.Например: он будет построчно обрабатывать выполнение так, как ждет, пока ответ не будет получен от await, а затем продолжит работу.

 `function doubleAfter2Seconds(x) {
    return new Promise(resolve => {
      setTimeout(() => {
        resolve(x * 2);
      }, 2000);
    });
  }

  async function addAsync(x) {
     console.log("Here I am before first await"); 
    const a = await doubleAfter2Seconds(10);
    console.log("A ouput is ",a);
    const b = await doubleAfter2Seconds(20);
    console.log("B ouput is ",b);
    const c = await doubleAfter2Seconds(30);
    console.log("C ouput is ",c);
    return x + a + b + c;
  }


  addAsync(10).then((sum) => {
    console.log(sum);
  });`

Приведенный выше код выведет результат, как показано ниже:

enter image description here

Надеюсь, это поможет понять асинхронность / ожидание

...