需要了解异步功能

use*_*080 1 javascript ecmascript-6

我正在尝试从 setTimeout 获取值。但控制台没有给出任何结果。如何处理这个async功能?任何人都可以帮助我以正确的方式理解这一点吗?

这是我的尝试:

async function getTheme() {
    const value = 'abc'
    setTimeout(() => {
        return value;
    }, 3000);
}

getTheme().then(time => console.log(time)); //getting no result.
Run Code Online (Sandbox Code Playgroud)

Ter*_*rry 6

那是因为您在setTimeout回调中返回,它实际上并没有解决承诺。

你想要的是改为返回一个承诺:

function getTheme() {
    const value = 'abc'

    return new Promise(resolve => {
        setTimeout(() => resolve(value), 3000);
    })
}
Run Code Online (Sandbox Code Playgroud)

没有必要使用async,因为您已经在getTheme()函数中返回了一个承诺。

当然,您可以将整个“等待”逻辑抽象为另一个函数:然后,async如果您愿意,可以保留:

function sleep(duration) {
    return new Promise(resolve => setTimeout(resolve, duration));
}

async function getTheme() {
    const value = 'abc';

    await sleep(3000);

    return value;
}
Run Code Online (Sandbox Code Playgroud)