жду разрушает порядок - PullRequest
0 голосов
/ 23 января 2020

Не могли бы вы объяснить, почему ключевое слово await приводит к тому, что текст Hello World помещается в середину (первый пример) и в конец (второй пример) выходных данных?

Первый пример:

const getData = async() => { 
    var y = "Hello World"; 
    console.log(y); 
} 

console.log(1); 
getData(); 
console.log(2); 

Вывод первого примера:

1
Hello World
2

Второй пример :

const getData = async() => { 
    var y = await "Hello World"; 
    console.log(y); 
} 

console.log(1); 
getData(); 
console.log(2); 

Вывод второго примера:

1
2
Hello World

1 Ответ

2 голосов
/ 23 января 2020

Оба примера возвращают Promise, но есть ключевое различие, которое ищет механизм сценариев ... Есть ли что-то асинхронное в ожидании? В первом примере нет, но во втором примере код по крайней мере говорит, что есть. (Хотя я мог бы ожидать, что любая достойная IDE будет жаловаться на это, поскольку строковый литерал не является асинхронной операцией. Однако сам язык может быть довольно прощающим.)

Даже если вы выполняете асинхронную операцию в первом примере, если вы не ожидаете этого, окружающий код все равно будет работать синхронно. Вы просто не сможете наблюдать результат (или неудачу) этой операции. (Ну, вы можете добавить .then() к нему, но тогда зачем использовать async? В этот момент вы будете смешивать свои асинхронные соглашения.)

Если вы звоните getData() внутри async функция, то вы можете ждать ее:

console.log(1);
await getData();
console.log(2);

Или, альтернативно, вы можете продолжить с возвращенного обещания:

console.log(1);
getData().then(() => console.log(2));

Или, более многословно (или для любого, кто застрял в IE):

console.log(1);
getData().then(function () {
    console.log(2);
});
...