Две версии вашего кода практически эквивалентны.Любая функция, объявленная с использованием ключевого слова async
, возвращает обещание.
Например, следующая функция, несмотря на то, что она не имеет ничего общего с обещанием, возвращает обещание:
async function helloWorld() {
return "Hello World";
}
Мы можем проверить это следующим образом
> helloWorld().then(result => console.log(result));
Hello World
Как подсказывает ключевое слово async
, мы указываем среде выполнения JavaScript, что она должна запускать функцию асинхронно.Поскольку вызывающая функция должна немедленно получить результат при выполнении чего-то вроде let result = helloWorld()
, result
содержит Обещание, которое в конечном итоге преобразуется в возвращаемое значение helloWorld()
(или будет отклонено, если helloWorld()
выдает ошибку).
Итак, в вашем коде почти нет разницы между верхней версией (result = await new Promise...
) и нижней версией (result = new Promise...
): в обоих случаях ваша функция asyncData()
вернет Promiseкоторый в конечном итоге разрешает данные запроса или отклоняет его в случае сбоя.
Существует одно небольшое отличие.В верхней версии кода, которая выполняет result = await new Promise...
, строки 23 и 24 будут выполняться только после строк 6-22, поэтому вы увидите «Успешный повторный вызов», прежде чем увидите «Возврат обещания».В нижней версии кода, которая выполняет result = new Promise...
, строка 23 будет выполнена немедленно, поэтому сначала вы увидите «Успешный вызов покоя».
Причина этого различия заключается в том, что оператор await
похоже на размещение каждой строки после оператора await
в блоке then
.Пример ниже иллюстрирует это.
async function returnsAPromise() {
return Promise.resolve("Hello World");
}
// this will log the result first.
async function withAwait() {
const result = await returnsAPromise();
console.log(result);
console.log("rest of function");
}
// this is equivalent to the function above, because of the way await works.
function withEquivalentThen() {
const result = returnsAPromise();
result.then(r => {
console.log(r);
console.log("rest of function");
});
}
// this version logs "rest of function" first.
function dontWaitForPromiseThen() {
const result = returnsAPromise();
result.then(r => console.log(r));
console.log("rest of function");
}