Javascript 等待,不要做我所期望的
我认为使函数异步使其返回承诺,而wait使其等待。为什么printer()首先完成?您的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
计时器
函数不起作用,因为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()