JavaScript является однопоточным и выполняется в том же потоке, что и пользовательский интерфейс. Таким образом, весь код JavaScript блокирует пользовательский интерфейс. Как упоминалось другими, веб-воркеры могут использоваться для запуска кода в других потоках, но у них есть ограничения.
Разница между асинхронными функциями и обычными в том, что они возвращают обещание. Затем с помощью обратного вызова вы можете отложить выполнение кода, который обрабатывает результат вызова функции и тем самым позволяет пользовательскому интерфейсу выполнять некоторую работу. Следующие три примера имеют такой же эффект:
async function foo() {
console.log("hi");
return 1;
}
foo().then(result => console.log(result))
console.log("lo");
function foo() {
console.log("hi");
return 1;
}
Promise.resolve(foo()).then(result => console.log(result))
console.log("lo");
function foo() {
console.log("hi");
return 1;
}
const result = foo();
setTimeout(() => console.log(result));
console.log("lo");
Во всех трех случаях консоль регистрирует hi, lo, 1. До того, как будет напечатано 1, пользовательский интерфейс может обрабатывать ввод данных пользователем или рисовать обновления. Причина 1, которая печатается последней в первых двух случаях, заключается в том, что обратные вызовы для обещаний не выполняются немедленно.
await
позволяет делать это без обратных вызовов:
async function foo() {
console.log("hi");
return 1;
}
async function bar() {
const result = await foo();
console.log(result);
}
bar();
console.log("lo");
Это также напечатает hi, lo, 1. Как и при обратном вызове для обещания, код после await
никогда не выполняется немедленно.
person
a better oliver
schedule
16.03.2017
setTimeout
, ответа XHR или события щелчка: jsfiddle. net / wgqyayhr (для демонстрации нужен браузер с поддержкой) - person   schedule 14.03.2017async/await
не является частью ES7 (ES2016). Он будет частью выпуска этого года, ES2017. - person Felix Kling   schedule 16.03.2017