Создает ли async в Javascript асинхронную функцию? - PullRequest
0 голосов
/ 24 января 2019

Я запускаю следующий код:

let asyncFunction = async () => {
    console.log("hello world")
    return Promise.resolve("resolution");
}
let returnValue = asyncFunction();
console.log(returnValue)

В этом журнале "привет мир", а затем "Обещание {}".Мои вопросы:

1) Тот факт, что «hello world» регистрируется первым, указывает на то, что если сделать asyncFunction асинхронной функцией, она не будет выполняться асинхронно.Если бы он выполнялся асинхронно, он был бы помещен в очередь выполнения и не запускался до тех пор, пока основная функция не вышла из стека.то есть "console.log (returnValue)" будет запущен первым.Правильно ли я по этому поводу, что добавление «асинхронный» не делает функцию фактически выполняется асинхронно?

2) Если это так, что asyncFunction не выполняется асинхронно, то в строке «let returnValue = asyncFunction (); ", asyncFunction должна выполняться до того, как ее возвращаемое значение будет присвоено returnValue.Тот факт, что returnValue содержит «Promise {}», указывает, что asyncFunction еще не была запущена, что согласуется с асинхронностью asyncFunction.Если я удаляю ключевое слово «async» из определения asyncFunction, оно возвращает «привет мир», а затем «Promise {'resolution'}».Итак, означает ли это, что использование асинхронной функции делает функцию асинхронной?

Любое понимание будет оценено.Спасибо!

Ответы [ 2 ]

0 голосов
/ 24 января 2019

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

0 голосов
/ 24 января 2019

Правильно ли я по этому поводу, что добавление 'async' не делает функцию фактически запущенной асинхронно?

async функции фактически выполняют синхронно , построчно с самого начала, пока не встретится что-то асинхронное, например await в Promise. Это идентично поведению создания Promise вручную - конструктор Promise изначально будет работать синхронно, а не асинхронно, хотя он может выполнять асинхронные вызовы:

const prom = new Promise((resolve) => {
  console.log('inside constructor');
  resolve();
});
console.log('prom has been constructed');
prom.then(() => {
  console.log('inside then');
});
console.log('end of main thread');

Функция async всегда возвращает Promise, который разрешает все, что было return отредактировано функцией (или undefined). Посмотрите, как вызов .then при вызове функции async также приводит к выполнению .then в самом конце:

let asyncFunction = async () => {
    console.log("hello world")
    return Promise.resolve("resolution");
}
let returnValue = asyncFunction();
console.log('returnValue', returnValue);
returnValue.then(() => {
  console.log('inside then');
});
console.log('end of main thread');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...