Javascript 等待,不要做我所期望的

Javascript 等待,不要做我所期望的,javascript,asynchronous,async-await,Javascript,Asynchronous,Async Await,我认为使函数异步使其返回承诺,而wait使其等待。为什么printer()首先完成?您的计时器函数不起作用,因为setTimeout不会返回一个可以等待的承诺。您需要手动承诺: async function doThings() { async function timer () { setTimeout(() => { console.log('timer!') }), 1000 } async f

我认为使函数异步使其返回承诺,而wait使其等待。为什么printer()首先完成?

您的
计时器
函数不起作用,因为setTimeout不会返回一个可以等待的承诺。您需要手动承诺:

async function doThings() {
    async function timer () {
        setTimeout(() => {
            console.log('timer!')
        }), 1000
    }
    
    async function printer () {
        console.log('printer!')
    }

    await timer()
    await printer()
}

doThings()

我所能看到的只是timer()和printer()函数是异步函数,但它们中没有使用wait,这使得async关键字不起作用。

函数前面的“async”一词意味着一件简单的事情:函数总是返回一个承诺。其他值自动包装在已解析的承诺中

现在,当我们使用异步函数中的“不返回承诺”时,javascript解释器会自动返回已解析的承诺,这就是等待计时器函数获得已解析承诺的原因,解释器继续执行,但setTimeout仍在继续。所以我们必须从定时器函数返回一个承诺,并在setTimeout函数中解析它,如下所示

// set a default of 1500
function timeout(ms=1500) {
  return new Promise(resolve => setTimeout(resolve, ms));
};

async function printer() {
  console.log('printer!');
};

async function doThings() {
  await timeout(1000); // time in ms
  await printer();
};

doThings();

所以,如果我们不显式地从异步函数返回一个承诺,它会自动返回一个已解析的承诺,这使得wait不能在它立即解析时工作?我想我明白了,但这有什么用呢?是的,如果函数没有显式返回,异步函数将返回已解析的承诺,因此调用方将立即等待解析。是的,它只是一个更好的可读性和易于与承诺,没有更多,也没有更少。这就像是用在回信上一样好。但是承诺的链接使得代码更复杂。Async/await使代码更简单。让我们仅以您的代码为例,它看起来是这样的---timer()。然后(函数successmethod(){printer()},函数failuremethod(){})
async function doThings() {

    async function timer() {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                console.log(`timer!`);
                resolve();
            }, 1000)
        });
    }

    async function printer() {
        console.log('printer!')
    }

    await timer()
    await printer()
}

doThings()