异步函数的应用
主要参考资料:
- 《JavaScript 高级程序设计(第4版)》- P356(381/931)
模拟功能 sleep()
在异步函数中,可以实现类似 Java 中如 Thread.sleep() 之类的、能够暂时停止执行当前代码的功能。
示例:
- 在异步函数中实现暂时停止执行当前代码的的功能。
async function sleep(delay) { return new Promise( (resolve) => { setTimeout(resolve, delay) } ) } // 创建一个一定时间后落定为解决的期约 async function canPause() { const t = Date.now() await sleep(1000) // 暂停 1s 后,恢复执行 const t_01 = Date.now() console.log('paused time:', t_01 - t) } canPause() // 输出: // paused time: 1002
模拟平行执行
平行执行是相对于顺序执行的。
顺序执行
任务按顺序执行,只有上一个任务执行完毕后,才开始执行下一个任务。
平行执行
任务的执行没有顺序,是平行的(多线程)/ 随机的(单线程),不需要等待上一个任务执行完毕后,才开始执行下一个任务。
使用异步函数实现平行执行:
在异步函数中按顺序等待各个表达式的值,并在开始等待之前异步开启各个表达式主要的求值。
单线程中的平行执行:
在 JavaScript 这种单线程语言上使用平行执行,主要是减少下一个任务等待执行的等待时间。
从线程的实际执行的性能(线程的使用时间)上看,使用平行执行与使用顺序执行的几乎是没有差别。
因为当某个任务处于等待状态时,这个任务并不总是占用线程的,JavaScript 引擎会安排其它任务使用线程。
平行执行与顺序执行之间细微的性能差别来自于,顺序执行需要更多地进入线程来确定表达式是否已经完成求值,这会消耗一些性能。
所以平行执行,主要是一种寻求能够合理调度任务执行顺序的策略,使开发者能够有能力可以根据具体情况和需求调度任务的执行顺序。
其实无论是单线程还是多线程,平行执行等一些编程优化策略,其目标、意义都是相同的,都是寻求使任务的执行更符合需求,或者更加有效率地使用线程。
示例:
-
顺序执行。
let t_finished = 0 async function randomDelay(id) { const delay = Math.random() * 1000 return new Promise( (resolve) => { const t = Date.now() setTimeout( () => { const t_consumed = Date.now() - t console.log(`