为什么异步在我的情况下不起作用(Node js)?

时间:2019-07-07 17:38:26

标签: javascript typescript asynchronous async-await

我是异步/等待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”,就像是同步的一样。

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可让您遍历生成器返回的承诺的履行值。