写单片机点灯那会儿,第一件事就是让灯闪起来,代码里几乎都会出现 delay 这么个东西。等转到前端做动画,又有人问 JS 里有没有 delay 函数,答案没这么直接,得看平台。

在单片机里,delay 一般是自己写或者库给的一个忙等函数,参数是毫秒。它的实现就是让 CPU 空转,数一堆空操作指令,数够了才往下走。好处是简单,坏处是这段时间 CPU 干不了别的,串口数据来了都收不到。

delay 一开长,整个程序就卡住了

做流水灯还行,一旦要同时按键、收数据、跑显示,用 delay 就会漏事件。按键按下那一刻没在轮询,直接丢。所以实际项目里更推荐定时器加状态机,或者用非阻塞写法,把等待切成一小段一小段。

JS 里没有 delay,只有 setTimeout 和 Promise

前端常有人说想 sleep 一下,语言里其实没这个函数。要延后执行用 setTimeout,传毫秒和回调;想在 async 函数里像同步那样等,就包一个 Promise 加 setTimeout,配合 await 用。注意这两个都是异步的,delay 那行后面的代码不会卡住,是排队等着执行的。

还有种写法是用 while 加 Date.now 死循环等,千万别这么干,会把浏览器主线程堵死,页面直接卡成假死,风扇狂转。

Python 里的 time.sleep 会真的阻塞当前线程,写多线程脚本时记得它会把整个线程停住。Linux shell 里的 sleep 就是命令,写定时脚本天天用。

  • 单片机点灯:短延时用 delay 无所谓,功能一多就换定时器
  • 网页动画:用 setTimeout 或者 requestAnimationFrame,别死循环
  • 脚本间隔:Python 用 sleep,shell 直接敲 sleep 数字

补个容易忽略的点,delay 的参数单位各平台不一样。单片机里常常是毫秒,但有些库默认传的是时钟周期数,写 1000 可能只等了半毫秒,灯看着就是常亮不闪。拿示波器量一下或者翻库的头文件确认单位,比反复改数字快得多。

一句话:delay 是让机器干等,能用事件和回调的地方就别干等,尤其在单线程的浏览器里,等错的代价是整页卡死。