JavaScript专项算法题(4):异步

简介: 异步挑战一 sayHowdy问题:思考时间(现在暂时不需要编写代码):分析下方挑战一的代码,打印出来的结果会是怎样顺序的?Howdy先还是Partnah先?题解:123456789101112/* CHALLENGE 1 */function sayHowdy() { console.log('Howdy');}function testMe() { setTimeout(sayHowdy, 0); console.log('Partnah');}// After thinking it through, uncomment t

异步

挑战一 sayHowdy

问题:

思考时间(现在暂时不需要编写代码):分析下方挑战一的代码,打印出来的结果会是怎样顺序的?Howdy先还是Partnah先?

题解:

1
2
3
4
5
6
7
8
9
10
11
12
/* CHALLENGE 1 */
functionsayHowdy() {
console.log('Howdy');
}
functiontestMe() {
  setTimeout(sayHowdy, 0);
console.log('Partnah');
}
// After thinking it through, uncomment the following line to check your guess!
// testMe(); // what order should these log out? Howdy or Partnah first?

挑战二 delayedGreet

问题:

构建delayedGreet函数,用于在3秒后打印“welcome”。

题解:

1
2
3
4
5
6
7
8
/* CHALLENGE 2 */
functiondelayedGreet() {
// ADD CODE HERE
  setTimeout(()=>console.log('welcome'), 3000);
}
// Uncomment the following line to check your work!
// delayedGreet(); // should log (after 3 seconds): welcome

挑战三 helloGoodbye

问题:

构建helloGoodbye函数。其会立刻打印”hello”,然后2秒后打印“good bye”。

代码:

1
2
3
4
5
6
7
8
9
/* CHALLENGE 3 */
functionhelloGoodbye() {
// ADD CODE HERE
  setTimeout(()=>console.log('good bye'), 2000);
console.log('hello');
}
// Uncomment the following line to check your work!
// helloGoodbye(); // should log: hello // should also log (after 3 seconds): good bye

挑战四 brokenRecord

问题:

构建brokenRecord函数。其会每秒钟都打印一次”hi again“。使用”End Code“按钮结束打印如果你对代码的运行满意的话。(译注:原题库网页上的按钮)

题解:

1
2
3
4
5
6
7
8
/* CHALLENGE 4 */
functionbrokenRecord() {
// ADD CODE HERE
  setInterval(()=>console.log('hi again'), 1000);
}
// Uncomment the following line to check your work!
// brokenRecord(); // should log (every second): hi again

挑战五 limitedRepeat

问题:

构建limitedRepeat函数。其会每秒钟打印一次”hi for now”,但仅仅持续5秒钟。如果你感到困难的话,研究clearInterval。

题解:

1
2
3
4
5
6
7
8
9
/* CHALLENGE 5 */
functionlimitedRepeat() {
// ADD CODE HERE
const intervalId = setInterval(()=>console.log('hi for now'), 1000);
  setTimeout(()=>clearInterval(intervalId), 5000);
}
// Uncomment the following line to check your work!
// limitedRepeat(); // should log (every second, for 5 seconds): hi for now

挑战六 everyXsecsForYsecs

问题:

构建everyXsecsForYsecs函数。其接受三个参数:一个函数func、一个数字interval和另外一个数duration。

everyXsecsForYsecs函数会以interval秒的间隔运行函数func,但会在duration秒后结束运行。

题解:

1
2
3
4
5
6
7
8
9
10
11
12
13
/* CHALLENGE 6 */
functioneveryXsecsForYsecs(func, interval, duration) {
// ADD CODE HERE
const intervalId = setInterval(func, interval * 1000);
  setTimeout(() => clearInterval(intervalId), duration * 1000);
}
// Uncomment the following lines to check your work!
functiontheEnd() {
console.log('This is the end!');
}
everyXsecsForYsecs(theEnd, 2, 20); // should invoke theEnd function every 2 seconds, for 20 seconds): This is the end!

挑战七 delayCounter

问题:

构建delayCounter函数,接受的第一个参数为一个数组(称为target),第二个参数为毫秒单位的数字(称为wait),返回结果为一个函数。

当返回函数被调用时,它会依序打印从1到target之间的数字(含target),以wait毫秒的时间间隔。

题解:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/* CHALLENGE 7 */
functiondelayCounter(target, wait) {
// Solution 1:
let intervalId;
let counter = 0;
returnfunctioninner() {
if (counter === 0) {
        counter++;
        intervalId = setInterval(() =>console.log(inner()), wait);
        } elseif (counter === target) {
        clearInterval(intervalId);
return counter;
        } else {
return counter++;
		}
	}
// Solution 2:
//return function inner() {
//	for(let i = 1; i<=target; i++){
//  setTimeout(()=>console.log(i), wait * i);
//	}
//}
}
// UNCOMMENT THESE TO TEST YOUR WORK!
// const countLogger = delayCounter(3, 1000)
// countLogger();
// After 1 second, log 1
// After 2 seconds, log 2
// After 3 seconds, log 3

挑战八 promised

问题:

构建promised函数,接受一个值作为参数。它会返回一个在两秒后触发resolve函数的Promise对象。

提示:到MDN去查阅下Promise对象的文档。

题解:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/* CHALLENGE 8 */
functionpromised (val) {
// ADD CODE HERE
const promiseObj = newPromise((resolve) => {
    setTimeout(() => resolve(val), 2000);
  });
return promiseObj;
}
// UNCOMMENT THESE TO TEST YOUR WORK!
// const createPromise = promised('wait for it...');
// createPromise.then((val) => console.log(val)); 
// will log "wait for it..." to the console after 2 seconds

挑战九 SecondClock

问题:

编写一个SecondClock类。其有两个方法:start和reset。

start:当调用时,start会每秒调用一个回调函数(this.cb,在构造器中定义),作用于一个变量。这个变量每次被回调函数使用时总是当前的时间秒数。

换言之,此回调函数每一秒钟都基于时钟信号的秒数而被调用,总是从1开始但并不使用当前计算机上的时钟信号的秒数值。

第一次“滴答”(值为1)发生在最初的secondClock调用的1秒后;

第二次“滴答”(值为2)发生在最初的secondClock调用的2秒后;

……

第六十次“滴答”(值为60)发生在最初的secondClock调用的60秒后;

第六十一次“滴答”(值为61)发生在最初的secondClock调用的61秒后;

第六十二次“滴答”(值为62)发生在最初的secondClock调用的62秒后;

以此类推。

reset:当调用时,完全停止SecondClock时钟的运行,另外重设时间为初始值。

提示:查阅setInterval和clearInterval。

题解:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/* CHALLENGE 9 */
classSecondClock{
constructor(cb) {
// ADD CODE HERE
this.counter = 0
this.intervalId = 0
this.cb = cb
  }
// ADD METHODS HERE
  start () {
this.intervalId = setInterval(()=>this.cb(++this.counter), 1000);
  }
  reset () {
    clearInterval(this.intervalId);
this.counter = 0;
this.intervalId = 0;
  }
}
// UNCOMMENT THESE TO TEST YOUR WORK!
// const clock = new SecondClock((val) => { console.log(val) });
// console.log("Started Clock.");
// clock.start();
// setTimeout(() => {
//     clock.reset();
//     console.log("Stopped Clock after 6 seconds.");
// }, 6000);

挑战十 debounce

问题:

构建debounce函数,接受参数为一个回调函数callback和一个数值interval,返回结果为一个函数。此返回函数仅会在其上次调用回调函数的interval毫秒后才会被再次调用回调函数。

在interval毫秒时间内调用返回函数不会被响应或列入队列,然而时间信息会被重置( 译注:interval时间重新开始计算)。

有关防抖函数的例子:请查看这个链接 https://css-tricks.com/debouncing-throttling-explained-examples/

题解:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/* CHALLENGE 10 */
functiondebounce(callback, interval) {
// ADD CODE HERE
// Solution 1:
let timeCounter = 0
let timeoutId = null
returnfunction() {
if (timeCounter === 0) {
      timeoutId = setTimeout(()=>{timeoutId = null;timeCounter = 0;}, interval);
      timeCounter++;
return callback();
    } else {
if (timeoutId) {
        clearTimeout(timeoutId);
      	timeoutId = setTimeout(()=>{timeoutId = null; timeCounter = 0;}, interval);
        timeCounter++;
      } else {
        timeCounter++;
return callback();
      }
    }
  }
//   // Solution 2 (Not efficient): 
//   return function (){
//     if (timeoutId) {
//       clearTimeout(timeoutId);
//       timeoutId = setTimeout(() => timeoutId = null, interval);
//     } else {
//       timeoutId = setTimeout(() => timeoutId = null, interval);
//       return callback();
//     }
//   }
}
// UNCOMMENT THESE TO TEST YOUR WORK!
functiongiveHi() { return'hi'; }
const giveHiSometimes = debounce(giveHi, 3000);
console.log(giveHiSometimes()); // -> 'hi'
setTimeout(function() { console.log(giveHiSometimes()); }, 2000); // -> undefined
setTimeout(function() { console.log(giveHiSometimes()); }, 4000); // -> undefined
setTimeout(function() { console.log(giveHiSometimes()); }, 8000); // -> 'hi'
相关文章
|
2月前
|
存储 监控 算法
局域网监控其他电脑的设备信息管理 Node.js 跳表算法
跳表通过分层索引实现O(logn)的高效查询、插入与删除,适配局域网监控中设备动态接入、IP映射及范围筛选等需求,相比传统结构更高效稳定,适用于Node.js环境下的实时设备管理。
141 9
|
4月前
|
存储 监控 JavaScript
基于布隆过滤器的 Node.js 算法在局域网电脑桌面监控设备快速校验中的应用研究
本文探讨了布隆过滤器在局域网电脑桌面监控中的应用,分析其高效空间利用率、快速查询性能及动态扩容优势,并设计了基于MAC地址的校验模型,提供Node.js实现代码,适用于设备准入控制与重复数据过滤场景。
217 0
|
2月前
|
存储 监控 JavaScript
企业上网监控系统的恶意 URL 过滤 Node.js 布隆过滤器算法
布隆过滤器以低内存、高效率特性,解决企业上网监控系统对百万级恶意URL实时检测与动态更新的难题,通过概率性判断实现毫秒级过滤,内存占用降低96%,适配大规模场景需求。
258 3
|
2月前
|
存储 监控 算法
电脑管控软件的进程优先级调度:Node.js 红黑树算法
红黑树凭借O(log n)高效插入、删除与查询特性,适配电脑管控软件对进程优先级动态调度的高并发需求。其自平衡机制保障系统稳定,低内存占用满足轻量化部署,显著优于传统数组或链表方案,是实现关键进程资源优先分配的理想选择。
180 1
|
3月前
|
存储 机器学习/深度学习 人工智能
软考中级软件设计师专项-数据结构与算法上篇
软件设计师考试数据结构模块涵盖数组、链表、栈、队列、树、图等基础结构及其操作,重点考查二分查找、快排与归并排序、树/图的DFS/BFS遍历算法,要求掌握时间与空间复杂度分析,理解哈希、堆的应用场景,强调通过合理选择数据结构优化程序性能,解决存储管理与计算效率问题,为系统设计奠定核心逻辑基础。
523 1
软考中级软件设计师专项-数据结构与算法上篇
|
3月前
|
运维 监控 JavaScript
基于 Node.js 图结构的局域网设备拓扑分析算法在局域网内监控软件中的应用研究
本文探讨图结构在局域网监控系统中的应用,通过Node.js实现设备拓扑建模、路径分析与故障定位,提升网络可视化、可追溯性与运维效率,结合模拟实验验证其高效性与准确性。
259 3
|
7月前
|
监控 算法 JavaScript
基于 JavaScript 图算法的局域网网络访问控制模型构建及局域网禁止上网软件的技术实现路径研究
本文探讨局域网网络访问控制软件的技术框架,将其核心功能映射为图论模型,通过节点与边表示终端设备及访问关系。以JavaScript实现DFS算法,模拟访问权限判断,优化动态策略更新与多层级访问控制。结合流量监控数据,提升网络安全响应能力,为企业自主研发提供理论支持,推动智能化演进,助力数字化管理。
203 4
|
7月前
|
监控 算法 JavaScript
公司局域网管理视域下 Node.js 图算法的深度应用研究:拓扑结构建模与流量优化策略探析
本文探讨了图论算法在公司局域网管理中的应用,针对设备互联复杂、流量调度低效及安全监控困难等问题,提出基于图论的解决方案。通过节点与边建模局域网拓扑结构,利用DFS/BFS实现设备快速发现,Dijkstra算法优化流量路径,社区检测算法识别安全风险。结合WorkWin软件实例,展示了算法在设备管理、流量调度与安全监控中的价值,为智能化局域网管理提供了理论与实践指导。
204 3
|
8月前
|
传感器 算法 数据安全/隐私保护
基于PI控制算法的异步感应电机转速控制系统simulink建模与仿真
本课题研究基于PI控制算法的异步感应电机转速控制系统,利用Simulink建模与仿真。PI控制器结合比例与积分部分,实现快速响应和稳态误差消除。系统通过速度传感器反馈实际转速,经SPWM调制驱动电机,形成闭环控制。仿真中设置不同参考速度(如600-&gt;800、1500-&gt;2200等),验证系统性能。模型基于MATLAB 2022a开发,适用于电机高效稳定运行的研究与应用。
|
9月前
|
监控 算法 JavaScript
企业用网络监控软件中的 Node.js 深度优先搜索算法剖析
在数字化办公盛行的当下,企业对网络监控的需求呈显著增长态势。企业级网络监控软件作为维护网络安全、提高办公效率的关键工具,其重要性不言而喻。此类软件需要高效处理复杂的网络拓扑结构与海量网络数据,而算法与数据结构则构成了其核心支撑。本文将深入剖析深度优先搜索(DFS)算法在企业级网络监控软件中的应用,并通过 Node.js 代码示例进行详细阐释。
190 2

热门文章

最新文章