给 setTimeout、setInterval 配备 await 写法
发布于 22 天前 作者 daGaiGuanYu 808 次浏览 来自 分享

setTimeout、setInterval 是两个常用的异步函数。
但作为异步函数,他们不支持 Promise或者 async/await写法。
代码写起来:

setTimeout(() => {
  console.log('执行一些操作')
  setTimeout(() => {
    console.log('执行另一些操作')
    // setTimeout ...
  }, 3000)
}, 1000)

不好看!

尽管经过简单的封装,可以达到目的,但每次用到都封装一次——重复造轮子。
本篇介绍一个使用起来很方便的轮子:丑丑仔。

使用

安装

npm install ccz

例子

程序“暂停”一秒
const timeoutP = require('ccz/timeout')

async function main(){
  console.log('开始')
  await timeoutP(1000)
  console.log('一秒之后')
  await timeoutP(2000)
  console.log('又过了两秒')
}

main()
每秒一次,共三次
const intervalP = require('ccz/interval')

async function main(){
  console.log('开始')
  await intervalP(1000, 3, () => {
    console.log('哈哈')
  })
  console.log('结束')
}

main()
先停一秒,再每秒执行一次,执行两次;再停两秒,每半秒执行一次,执行三次,再等一秒!
const { timeoutP, intervalP } = require('ccz')

async function main(){
  console.log('开始')
  await timeoutP(1000) // 等一秒
  await intervalP(1000, 2, () => {
    console.log('每秒一次,共两次')
  })
  
  await timeoutP(2000) // 等两秒
  await intervalP(500, 3, () => {
    console.log('每半秒一次,共三次')
  })
  await timeoutP(1000) // 等一秒
  
  console.log('结束')
}

main()
一秒执行 24 次
const withoutIntervalP = require('ccz/without-interval')

async function main(){
  console.log('开始')
  await withoutIntervalP(1000, 24, () => {
    console.log('换帧')
  })
  console.log('结束')
}

main()

仓库链接,点这里

6 回复
setTimeout(() => {
  console.log('执行一些操作')
  setTimeout(() => {
    console.log('执行另一些操作')
    // setTimeout ...
  }, 3000)
}, 1000)

包一下就可以 await 了

async function main() {
  await new Promise((done) => setTimeout(() => {
    console.log('执行一些操作', 1)
    done();
  }, 1000));

  await new Promise((done) => setTimeout(() => {
    console.log('执行另一些操作', 2)
    done();
  }, 3000));

  // 你还可以在里面 await
  await new Promise((done) => setTimeout(async () => {
    console.log('再执行另一些操作', 3)

    await new Promise((done) => setTimeout(() => {
      console.log('再在执行另一些操作', 4)
      done();
    }, 3000));

    done();
  }, 5000));

  console.log('over');
}

可以根据自己的需要包一下 new Promise 的过程… 整体上还是挺简单的…

不是应该叫靓仔吗

node 16已经支持了😂

import { setTimeout } from 'timers/promises';
async function run() {
  await setTimeout(5000);
  console.log('Hello, World!');
}
run();

@lellansin 我一般也是这样操作的,哈哈

回到顶部