不使用async+await,在for循环中使用Promise来 `消除回调`

使用ES7给我们提供的asyncawait,确实可以在一定程度上消除一些回调函数的使用,为我们的编程带来不少地方便。

例如,现在有一个函数:

function sleep(duration) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve();
    },duration)
  })
}

我们现在想利用以上的函数实现这样一个需求,程序每睡上一秒,就打印一个"ok",一共打印3次,那么我们的代码可能是这样的:

(async () => {
  for (let i = 0; i < 3; i++) {
    await sleep(1000);
    console.log("ok")
  }
})()

这样的代码当然是非常好的,它使用了async 和await ,消除了Promise原本的回调,让代码看起来更简洁,更优雅,同时也利于维护,可以让代码写在for循环里,每次遍历都让程序睡上1秒钟,非常灵活。

当然,本篇博客的目的不是为了介绍async 和await,而是我们应该考虑的是,如果没有async 和await,我们的代码是怎么编写的呢?

可能我们的代码不得不书写成这样:

sleep(1000).then(() => {
  console.log("ok");
  return sleep(1000);
}).then(() => {
  console.log("ok");
  return sleep(1000);
}).then(() => {
  console.log("ok");
  return sleep(1000);
})

Promise解决了回调地狱的问题,但是面对这样的需求,它的链式编程显得有点代码臃肿了。因为每一次调用then方法,实现的都是一样的逻辑。如果我要打印100次"ok",那代码岂不是要写100份,可见这样的代码冗余度太高,难以维护。

思考:以上代码,可不可以写成一个for循环呢?

答案当然是可以的,写法如下:

for (let i = 0, pro = sleep(1000); i < 3; i++) {
  pro = pro.then(function () {
    console.log("ok");
    return sleep(1000);
  });
}

实际上我们可以看到,这样的写法,没有消除回调,它只适用于循环体内使用,但这样的代码,是比较容易维护和修改的。

本篇文章可以看作 js 代码书写的小技巧,当然有了async 和await以后,我们完全用不到这样的写法。但是代码的高效和整洁,以及可维护性,是我们每一个开发者应该关注且不可忽视的"小"细节。

如果看到本篇博客的你,有更好的写法或思路,欢迎评论区留言哦~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值