CNode

给 setTimeout、setInterval 配备 await 写法

分享
DdaGaiGuanYu发布于5 年前最后回复5 年前8 回复6335 浏览0 收藏

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()

仓库链接,点这里

查看回复

回复 (8)

L
lellansin#1·5 年前
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 的过程.. 整体上还是挺简单的..

H
hsiaosiyuan0#2·5 年前

不是应该叫靓仔吗

C
chenkai0520#3·5 年前

node 16已经支持了😂

import { setTimeout } from 'timers/promises';
async function run() {
  await setTimeout(5000);
  console.log('Hello, World!');
}
run();
D
daGaiGuanYu#4·5 年前
引用 chenkai0520node 16已经支持了😂

@chenkai0520 有点期待

L
luanxuechao#6·5 年前

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

G
gocpplua#7·5 年前
引用 chenkai0520node 16已经支持了😂

@chenkai0520 这个真香

R
reai99#8·5 年前

不错点赞

参与回复
登录后即可参与回复。登录