我是异步/等待Node的新手。我很难理解异步/等待的工作方式。如果有人可以为我指明学习的方向,将不胜感激。
async function loop() {
let i = 0;
while (i < 10000) {
i++;
}
console.log('step 2');
}
console.log('step 1');
loop();
console.log('step 3');
预期:依次显示“步骤1”,“步骤3”,“步骤2”,但它会打印“步骤1”,“步骤2”,“步骤3”,就像是同步的一样。
答案 0 :(得分:3)
异步函数立即执行,只有在到达第一个def array_front9(nums):
for i in nums[:4]:
if i == 9:
return True
return False
语句时才“暂停”。
为此目的使用异步功能实际上没有多大意义。如果您的目标是稍后再执行一些操作,则可能需要await
。
答案 1 :(得分:0)
它按该顺序显示消息,因为没有触发异步操作。 While循环是同步执行的。 尝试这样的事情:
function timeout(){
return new Promise((resolve,reject) => {
setTimeout(() => {
resolve('step 2')
}, 1000)
})
}
async function loop() {
const result = await timeout()
console.log(result)
}
console.log('step 1');
loop();
console.log('step 3');
函数超时正在进行异步操作,您将在循环功能中等待使用await关键字完成该操作。
基本上,您使用await关键字来等待某些Promise(某些异步操作)得到解决,而await关键字只能在异步函数中使用。
我希望这个答案会有所帮助,我试图以最简单的方式进行解释。 :)
答案 2 :(得分:-1)
如果您希望loop
异步循环,请让它在循环中执行异步操作。 async
函数同步运行,直到第一个await
(或返回时)为止,这时它返回完成的承诺。
异步循环有时可以很好地建模为异步生成器函数:
function somethingAsync(value) {
return new Promise(resolve => {
setTimeout(() => {
resolve(value);
}, Math.random() * 50);
});
}
async function* loop() {
let i = 0;
while (i < 10) { // made it 10 instead of 10000
yield somethingAsync(i++);
}
console.log('step 2');
}
console.log('step 1');
const gen = loop();
console.log('step 3');
(async () => {
for await (const value of gen) {
console.log(value);
}
})();
在那里,生成器产生一个下一个值的承诺(显然,somethingAsync
是实际执行某项操作的占位符,而不是在延迟后仅返回该值)。使用for-await-of
可让您遍历生成器返回的承诺的履行值。