Подтвердить что ты не робот

Почему код после ожидания не запускается сразу? Разве он не должен быть неблокирующим?

Привет, ребята, мне трудно понять, как асинхронно и ждут работы за кулисами. Я знаю, что мы имеем promises, которые делают наш неблокирующий код, используя функцию "then", мы можем поместить всю работу, которую мы должны выполнить после того, как обещание будет разрешено. и работа, которую мы хотим сделать параллельно, чтобы обещать, мы просто напишем ее за пределами нашей тогдашней функции. Следовательно, код становится неблокирующим. Однако я не понимаю, как async await делает неблокирующий код.

async function myAsyncFunction() {
  try {
    let data = await myAPICall('https://jsonplaceholder.typicode.com/posts/1');
    // It will not run this line until it resolves await.
    let result = 2 + 2;
    return data;
  }catch (ex){
    return ex;
  }
}

См. приведенный выше код. Я не могу двигаться вперед, пока не будет разрешен вызов API. Если это делает мой код блокировки кода, как он лучше, чем promises? Или что-то я пропустил о async и await? Где я могу поместить свой код, который не зависит от ожидающего вызова? поэтому он может продолжать работать без ожидания выполнения выполнения?

Я добавляю код Promise, который хотел бы реплицировать в примере ожидания async.

function myPromiseAPI() {
  myAPICall('https://jsonplaceholder.typicode.com/posts/1')
    .then(function (data) {
        // data
    });
   // runs parallel
  let result = 2 + 2;
}
4b9b3361

Ответ 1

Как следует из его названия, ключевое слово await заставит функцию "ждать", пока ее обещание не разрешится, прежде чем выполнить следующую строку. Весь смысл await состоит в том, чтобы заставить код ждать, пока операция не будет выполнена, прежде чем продолжить.

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

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

function myAsyncFunction() {
  return myAPICall('https://jsonplaceholder.typicode.com/posts/1')
    .then(function (data) {
       let result = 2 + 2;
       return data;
    })
    .catch(function (ex) {
        return ex;
    });
}

Как мы можем видеть здесь, строка let result = 2 + 2; находится внутри обработчика .then(), что означает, что она не будет выполняться, пока не разрешится myAPICall(). То же самое, когда вы используете await. await просто абстрагирует .then() для вас.

Следует иметь в виду (и я думаю, что вы ищете), что вам не нужно использовать await сразу. Если бы вы написали свою функцию таким образом, вы могли бы сразу выполнить строку let result = 2 + 2;:

function myAPICall() {
  // simulate 1 second wait time
  return new Promise(resolve => setTimeout(resolve, 1000))
    .then(() => 'success');
}

async function myAsyncFunction() {
  try {
    console.log('starting');

    // just starting the API call and storing the promise for now. not waiting yet
    let dataP = myAPICall('https://jsonplaceholder.typicode.com/posts/1');

    let result = 2 + 2;

    // Executes right away
    console.log(result);

    // wait now
    let data = await dataP;

    // Executes after one second
    console.log(data);

    return data;
  } catch (ex) {
    return ex;
  }
}

myAsyncFunction();