繁体   English   中英

像使用 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)
}

所以这意味着如果我们想将一个 promise '转换'为一个异步函数,我们必须用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还是我可以使用带有return result async而不是使用带有resolve Promise

它未定义,因为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,
    )
}

这是一个有趣的。 这里的问题是

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

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

setTimeout只会安排您传递的任何内容并立即返回其 timeoutID。 在这种情况下,您真的需要手动处理 Promise 代码。

您忘记在test1等待setTimeout 发生的事情是你返回一个承诺的承诺。 第一个承诺被等待,但第二个(包装在第一个内的不是),而在test2你直接返回一个承诺。

在打字稿中更清楚,其中test1的类型应该是Promise<Promise<number>>test2的类型应该是Promise<number>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM