像使用 setTimeout 的承诺一样使用 setTimeout 构建异步不起作用

Building async with setTimeout like a promise with setTimeout doesn't work

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function 他们说写作

async function foo() {
   return 1
}

等同于写

function foo() {
   return Promise.resolve(1)
}

所以这意味着如果我们想 'transform' 一个异步函数的承诺,我们必须用 return promise_result 替换 resolve(promise_result)

但是当我尝试将 setTimeoutasync 一起使用时,它不起作用:

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();

如果我在 test2 上使用 await,它可以工作,但在 test1 上不起作用。这是为什么 ? async/await 只是为了处理未决承诺而不使用 .then 还是我可以将 asyncreturn result 一起使用而不是将 Promiseresolve 一起使用?

它未定义,因为 test1 没有 return 返回任何内容。仔细看看你return它在匿名函数后面

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,
    )
}

这很有趣。 这里的问题是

const test1 = async () => {
    setTimeout(
        () => {
            return 5;
        },
        2000,
    )
}

test1 是一个异步函数,但 setTimeout 不是。

setTimeout 将只安排您传递给它的任何内容,并立即 return 它的 timeoutID。 在这种情况下,您确实需要 手动 .

处理 Promise 代码