【问题标题】:how to use await/async in for loop如何在 for 循环中使用 await/async
【发布时间】:2020-05-15 09:15:09
【问题描述】:

为什么代码会这样打印??

循环下不能使用await吗?

>>>>> START
1

预期结果是'>>>>> START 1 2 3 >>>>> END'

let arr = [1, 2, 3]
async function print() {
  for (let n of arr) {
    await new Promise(
      resolve => {
        setTimeout(() => {
          console.log(n);
          resolve;
        }, 1000)
      }
    );
  }
}

async function main() {
  console.log(">>>>> START");
  await print();
  console.log(">>>>> END");
}

main()

【问题讨论】:

  • 试试这个setTimeout(() => { console.log(n); resolve(); }, 1000)
  • 因为第一个承诺没有解决,所以你的代码等到第一个承诺得到解决

标签: node.js for-loop asynchronous async-await


【解决方案1】:

简单的错字,你没有调用resolve 函数。您需要实际调用它,否则您的承诺将永远无法解决并且您的代码将永远不会继续(注意在您的 print 函数中在 resolve 之后添加括号):

async function print() {
  for (let n of arr) {
    await new Promise(
      resolve => {
        setTimeout(() => {
          console.log(n);
          resolve(); // invoke the function
        }, 1000)
      }
    );
  }
}

此外,每个 console.log 调用都会在新行上打印,因此输出不会完全符合您的预期,而是更像:

>>>>> START
1
2
3
>>>>> END

【讨论】:

    猜你喜欢
    • 2018-01-12
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    • 2019-02-25
    • 2021-08-13
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    相关资源
    最近更新 更多