JS关于async await一个巨难的问题

发布于 2022-09-11 21:59:06 字数 534 浏览 15 评论 0

代码如下

// 构造一个Promise对象
function timeout(ms){
  return new Promise((res,rej)=>{
    setTimeout(()=>{
      res()
    },ms)
  })
}

// 假定一个数组
const arr = [1,2,3]

// async函数
async function run(){
  arr.forEach(async ()=>{
    await timeout(1000)
  })
  console.log( '3秒过去了' )
}

run()

我希望‘3秒过去了’应该在3秒后打印出来,而上述代码运行后会瞬间打印

看下哪位大神能最先解决我的这个难题,以最优解者为胜,若差不多则以最先解出者为胜。

前提条件:必须使用arr.forEach,必须使用async await

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

殤城〤 2022-09-18 21:59:06
async function run(){
  for (let i of arr){
    await timeout(1000)
  }
  console.log( '3秒过去了' )
}

建议直接用for of 代替 forEach,一定要用forEach得另外去封装一个函数 得不偿失


//用MDN的Polyfill加上async await用了有坑别找我
Array.prototype.forEach = async function(callback, thisArg) {
  var T, k;
  if (this == null) {
    throw new TypeError(' this is null or not defined');
  }
  var O = Object(this);
  var len = O.length >>> 0;
  if (typeof callback !== "function") {
    throw new TypeError(callback + ' is not a function');
  }
  if (arguments.length > 1) {
    T = thisArg;
  }
  k = 0;
  while (k < len) {
    var kValue;
    if (k in O) {
      kValue = O[k];
      await callback.call(T, kValue, k, O);
    }
    k++;
  }
};
async function run(){
 await arr.forEach(async ()=>{
    await timeout(1000)
  })
  console.log( '3秒过去了' )
}
一紙繁鸢 2022-09-18 21:59:06

你是对forEach有什么误解。。。它并不会等传入的异步函数执行结束再遍历下一个元素。

养猫人 2022-09-18 21:59:06

问题提的确实符合你的名字,感觉在说相声

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文