Javascript 编写承诺的异步/等待版本
下面的代码按预期每秒记录一次“hello world”Javascript 编写承诺的异步/等待版本,javascript,async-await,Javascript,Async Await,下面的代码按预期每秒记录一次“hello world” function moveOneStep() { return new Promise((res, rej) => { setTimeout(() => { res(console.log('Hello world!')) }, 1000) }) } async function main() { await moveOneStep(); await moveOneStep();
function moveOneStep() {
return new Promise((res, rej) => {
setTimeout(() => {
res(console.log('Hello world!'))
}, 1000)
})
}
async function main() {
await moveOneStep();
await moveOneStep();
await moveOneStep();
await moveOneStep();
}
考虑到async
函数的return
值对应于Promissions中从resolve
函数返回的值,为什么下面的代码不输出相同的结果,而是一次记录所有的“hello world”:
async function moveOneStepAsync() {
setTimeout(() => {
return console.log('Hello world!');
}, 1000);
}
async function main() {
await moveOneStepAsync();
await moveOneStepAsync();
await moveOneStepAsync();
await moveOneStepAsync();
}
这是因为
setTimeout
不会在main
函数中返回对wait
的承诺。setTimeout本身是同步执行的。它向事件循环中添加回调,该回调作为参数传递,以便在前面提到的时间内执行
同样在这段代码中,回调的返回意味着什么也没有,因为回调将在1秒内运行,返回的值将不起作用
async
关键字告诉您函数返回promise,其中可能包含wait
able代码。因此,由于代码中没有wait,因此看起来
function moveOneStepAsync() {
setTimeout(() => {
return console.log('Hello world!');
}, 1000);
return Promise.resolve();
}
因此,main中的wait
将等待一个事件循环滴答声进入下一个“步骤”
阅读有关setTimeout、事件循环以及Wait希望更深入地理解它的内容您不向函数返回任何内容,而是返回内部setTimeout函数,这对该值没有任何作用。调用
setTimeout
不会返回承诺,而是立即返回计时器。因此,所有的moveOneStepAsync
调用都会立即执行,定时器设置好,一秒钟后就会触发。您的版本不会返回任何需要等待的值或承诺。请您进一步澄清一下好吗?异步函数返回的不是本质上的承诺吗?我希望能举个例子。你的上述评论应该是问题的一部分,因为它突出了误解的症结所在。@deceze它写在我的第二个例子之前。@UğurKaya我希望你能理解一点