js_基于async/await & Promise的异步编程实现电子时钟(秒表)+调试设计

基于promise的传统版

/* implement of simple clock: */
function clockByPromise() {
// return
p = new Promise(
(resolve) => {
// ()=>console.log(Date.now())
console.log(Date())
setTimeout(resolve,1000)
}
)
p.then(clockByPromise)
// return p
}
clockByPromise()

基于async/await 语法糖的实现

用于调试代码的一些准备代码

/* define(set) a d(debug)function to learn about the program running details more easily! */
d = console.log;
function empty(p1 = "", p2 = "", p3 = "") {
// empty
}
// d = empty;
inf = console.log;
function showSecond() {
const d = new Date()
return d.getSeconds()
}

基于递归调用

async function clock(No = 0) {
// defind a count:
// No=1
// console.log("hello clock!");
d("-------🌏-------")
d(`\n✔️start clock${No} :`,showSecond())
d(`entering await${No}:`,showSecond())
await new Promise(
(resolve) => {
d(`\t\tawait${No}`)
d("\t\tin await block1:first statment:🕐", showSecond())
console.log("\t⏰", showSecond());
setTimeout(resolve, 1000)
d("\t\tin await block2:after setTimeOut🕐", showSecond())
})
// d=inf
d(`left(out of) await${No} :`,showSecond())
d("\t\t🕐",showSecond(), "left await block just now.")
// clock() is a async function,that will be pushed to async task queue,and return as soon as possible.
clock(No+1);
/*
新的clock()的启动几乎时瞬间完成的(从运行结果可以看出).然后又回到当前主线程执行未完任务
clock是异步代码,在主线程将该任务快速排入到异步消息队列后,立刻回到主线程中执行尚未完成的任务,
(这里的await代码中存在一些打印语句,主线程会直接执行打印语句(这些不是耗时逻辑,将在执行await 块之时会执行掉),
而setTimeout()这种被认为时耗时逻辑的代码会被排入异步队列,而不是立刻执行,其余的非耗时逻辑则可以被一并执行掉
由于async/await语法糖的缘故,await 代码块之外的逻辑将需要等await块的逻辑结束后才能得到执行)
在本代码中,就是将inf()内容打印出来,这样,主线程中的任务(栈)就算执行完毕,
此时异步消息队列可以弹入新的任务到主线程中进行处理 */
inf(`🔶ended clock${No}!👬`,showSecond())
}

调用函数:

clock()

基于循环调用

/* 尝试用while改写 */
async function clockCalledByWhile(No = 0) {
await new Promise(
(resolve) => {
console.log("\t⏰", Date());
setTimeout(resolve, 1000)
})
}
async function testWhile() {
while (true) {
await clockCalledByWhile()
}
}

统筹调用函数

/* 统一控制执行所编写的函数 */
// 查看函数的类型信息
console.log(clock);
//基于递归:
// clock()
//基于循环:
testWhile()

运行结果预览


基于async的实现我只打印秒的部分,方便观察核心内容

posted @   xuchaoxin1375  阅读(4)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2022-05-15 android_某些库中的资源文件values.xml大杂烩现象(多种类型的资源值都定义在同一个xml文件中)
2022-05-15 stackOverflow_删除自己stackOverflow上的回答(delete my answer on stackoverflow)
点击右上角即可分享
微信分享提示