#javascript #asynchronous #async-await #promise
Вопрос:
На https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function они говорят , что написание
async function foo() {
return 1
}
это то же самое, что писать
function foo() {
return Promise.resolve(1)
}
Таким образом, это означает, что если мы хотим «преобразовать» обещание в асинхронную функцию, мы должны заменить resolve(promise_result)
на return promise_result
.
Но когда я пытаюсь использовать setTimeout
с async
ним, это не работает:
const test1 = async () => {
setTimeout(
() => {
return 5;
},
2000,
)
}
const test2 = () => new Promise(
(resolve, reject) => {
setTimeout(
() => resolve(25),
1000
)
}
)
const execute = async () => {
const result = await test1();
console.log(result); // undefined
}
execute();
Если я использую await
on test2
, это работает, но дальше не работает test1
. Почему это? Предназначен async/await
только для обработки ожидающих обещаний без использования .then
или я могу использовать async
with return result
вместо использования Promise
with resolve
?
Комментарии:
1. Ваше исходное преобразование применяется только в том случае, если вы возвращаетесь из основной функции. Это не работает с функциями обратного вызова.
2. Возвращаемое значение функции
setTimeout()
обратного вызова игнорируется.
Ответ №1:
Это не определено, потому test1
что ничего не возвращает обратно. посмотрите внимательнее, вы возвращаете его обратно в анонимной функции
const test1 = async () => { // <--- this function returns nothing back. Nothing means "undefined"
setTimeout(
() => { // <---- you return it here back in your anonymous function witch makes no sense
return 5;
},
2000,
)
}
Комментарии:
1. Спасибо за комментарий, теперь я понимаю, почему я получаю undefined обратно. Но как мне создать функцию, использующую
async
, а не Promises, которая используетsetTimeout
и возвращает что-то в конце?2. @David ну, я думаю, ты не можешь. использование
new Promise
— это путь
Ответ №2:
Это забавно. Проблема здесь в том, что
const test1 = async () => {
setTimeout(
() => {
return 5;
},
2000,
)
}
test1 — это асинхронная функция, но setTimeout
это не так.
setTimeout
просто запланирует все, что вы передаете, и немедленно вернет его timeoutID. В таком случае вам действительно нужно будет обработать код обещания вручную.