Artigo Diretório
Função assíncrona
async / await são duas novas palavras-chave de função adicionadas ao ES8, permitindo que o código escrito de maneira síncrona seja executado de forma assíncrona
1. assíncrono
A palavra-chave async é usada para declarar funções assíncronas. Esta palavra-chave pode ser usada antes de declarações de função, expressões de função, funções de seta e métodos
async function f() {
return 1;
}
Se a função assíncrona retornar um valor com retorno (se não houver retorno, ele retornará indefinido), este valor será automaticamente envolvido em uma promessa resolvida, e o resultado é o valor
async function f() {
return 1;
}
f().then(console.log); // 1
async garante que a função retorne uma promessa e também envolve valores não promissores nela
2. aguardar
await só funciona na função assíncrona.Esta palavra-chave pode suspender a execução do código da função assíncrona e esperar que a promessa seja resolvida.
async function f() {
let promise = new Promise((resolve, reject) => {
setTimeout(() => resolve("done!"), 1000)
});
let p = await promise; // 暂停
console.log(p); // 一秒后 "done!";
}
f();
A função é pausada na linha de espera até que o valor de p
seja obtido quando a promessa é estabelecida e continua a ser executada. Em comparação com a promessa . Então, é apenas uma sintaxe mais elegante para obter o resultado da promessa, e também é mais fácil ler e escrever.
A função acima pode ser reescrita como:
let promise = new Promise((resolve,reject)=>{
setTimeout(()=> resolve("done!"),1000)
});
promise.then(console.log);
ps. Await não pode ser usado em funções comuns e não pode ser usado em contextos de nível superior, como
<script>
tags M , mas as funções assíncronas podem ser definidas e executadas imediatamente
(async function f(){
console.log(await Promise.resolve(1));
})();
Para entender completamente a palavra-chave await, você deve saber que ela não está apenas esperando que um valor esteja disponível. Quando o tempo de execução do JavaScript encontra a palavra-chave await, ele registra onde a execução foi suspensa. Quando o valor à direita de await está disponível, o tempo de execução do JavaScript envia uma tarefa por push para a fila de mensagens e essa tarefa retoma a execução da função assíncrona.
async function foo() {
console.log(2);
await null;
console.log(4);
}
console.log(1);
foo();
console.log(3);
// 1
// 2
// 3
// 4
Mesmo se await for seguido por um valor imediatamente disponível, a última parte da função será avaliada de forma assíncrona
Resumindo
Uma função assíncrona é o resultado da aplicação de um contrato a uma função JavaScript. As funções assíncronas podem suspender a execução sem bloquear o thread principal.
A palavra-chave assíncrona antes da função tem dois efeitos:
- Esta função sempre retorna uma promessa.
- É permitido usar o await nesta função.
A palavra-chave await antes da promessa faz o mecanismo JavaScript esperar que a promessa seja estabelecida e então:
- Se houver um erro, uma exceção será lançada - assim como o lançamento de erro foi chamado lá.
- Caso contrário, o resultado é retornado.