Построение асинхронности с помощью setTimeout, как обещание с помощью setTimeout, не работает

#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. В таком случае вам действительно нужно будет обработать код обещания вручную.