асинхронная функция es8 async / await


Асинхронная функция

async / await - это два новых функциональных ключевых слова, добавленных в ES8, что позволяет коду, написанному синхронно, выполняться асинхронно

1. асинхронный

Ключевое слово async используется для объявления асинхронных функций. Это ключевое слово можно использовать перед объявлениями функций, выражениями функций, стрелочными функциями и методами.

    async function f() {
    
    
        return 1;
    }

Если асинхронная функция возвращает значение с возвратом (если возврата нет, она вернет undefined), это значение будет автоматически заключено в разрешенное обещание, а результатом будет значение

    async function f() {
    
    
        return 1;
    }
    f().then(console.log); // 1

async гарантирует, что функция возвращает обещание, а также обертывает в него значения, не являющиеся обещаниями

2. ждать

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

    async function f() {
    
    

        let promise = new Promise((resolve, reject) => {
    
    
            setTimeout(() => resolve("done!"), 1000)
        });
        let p = await promise;  // 暂停
        console.log(p); // 一秒后 "done!";
    }
    f();

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

    let promise = new Promise((resolve,reject)=>{
    
    
        setTimeout(()=> resolve("done!"),1000)
    });
    promise.then(console.log);

ps. Await не может использоваться в обычных функциях и не может использоваться в контекстах верхнего уровня, таких как <script>теги M , но асинхронные функции могут быть определены и выполнены немедленно

    (async function f(){
    
    
        console.log(await Promise.resolve(1));
    })();

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

    async function foo() {
    
    
        console.log(2);
        await null;
        console.log(4);
    }
    console.log(1);
    foo();
    console.log(3);
    // 1
    // 2
    // 3
    // 4

Даже если за ожиданием следует сразу доступное значение, более поздняя часть функции будет оцениваться асинхронно.

подводить итоги

Асинхронная функция - это результат применения контракта к функции JavaScript. Асинхронные функции могут приостанавливать выполнение, не блокируя основной поток.

Ключевое слово async перед функцией имеет два эффекта:

  1. Эта функция всегда возвращает обещание.
  2. В этой функции разрешено использовать ожидание.

Ключевое слово await перед обещанием заставляет движок JavaScript ждать выполнения обещания, а затем:

  1. Если есть ошибка, будет сгенерировано исключение - точно так же, как там была вызвана ошибка throw.
  2. В противном случае возвращается результат.

рекомендация

отblog.csdn.net/S_aitama/article/details/111146828