Node.js学习笔记之事件循环和callback

简介: 简单叙述一下什么是事件循环还是拿之前的餐厅来举例,我们去点了个番茄炒蛋,服务生告诉后厨做一个番茄炒蛋,张三也去了餐厅,点了个麻辣小龙虾,服务生又告诉后厨做一份麻辣小龙虾,小李也去了,点了个蛋炒饭。

简单叙述一下什么是事件循环

还是拿之前的餐厅来举例,我们去点了个番茄炒蛋,服务生告诉后厨做一个番茄炒蛋,张三也去了餐厅,点了个麻辣小龙虾,服务生又告诉后厨做一份麻辣小龙虾,小李也去了,点了个蛋炒饭。

解析一下这个情景,餐厅是一个事件循环,其中我们的点餐叫做线程。服务生第一个把我要的番茄炒蛋端过来了,于是我的线程结束了,因为麻辣小龙虾做的慢,蛋炒饭做完了,服务生又给小李端上来了蛋炒饭,小李虽然是后来的,但是他的过程要比张三快,最后小龙虾好了,服务生给张三端上来小龙虾,至此三个线程都结束了。

用代码实现一个简易版的事件循环

const eventloop = {
    // 事件队列
    queue: [],
    loop(){
        while(this.queue.length){
            // 如果有事件就进行处理
            var callback = this.queue.shift();
            callback();
        }
        // 每50毫秒会检测一下事件
        setTimeout(this.loop.bind(this),50);
    },
    // 添加事件
    add(callback){
        this.queue.push(callback);
    }
}

eventloop.loop();

// 分别在 500毫秒跟800毫秒,往队列中加入两个事件
setTimeout(()=>{
    eventloop.add(function(){
        console.log('第一个');
    })
},500)
setTimeout(()=>{
    eventloop.add(function(){
        console.log('第二个');
    })
},800)

有话说

当然,在真实情况中会比这复杂的多,不会每50毫秒去检测一次,要快的多,添加的事件也不会只有回调函数,例如一些文件读写操作等。我们的事件队列可能还会有文件处理队列,定时操作队列等多种不同的队列。

callback

  • 回调函数格式规范

    • error-first callback
    • Node-style callback
  • 第一个参数是error,后面的参数才是结果

场景

你在面试之后,面试官让你回去等消息。

结果:

  • 不过

ps:面试过了我们就笑一下,面试不过我们就哭!

先上代码:

    interview(function(err){
        if(err){
            return console.log('cry at 1st');
        }
        interview(function(err){
            if(err){
                return console.log('cry at 2nd');
            }
            interview(function(err){
                if(err){
                    return console.log('cry at 3rd');
                }
                console.log('smile');
            });
        })
    })
function interview(callback) {
    setTimeout(()=>{
        if(Math.random() < 0.8){
            callback('success');
        } else {
            callback( new Error('fail')); 
        }
    },1000)
}

这是一个正常的面试流程:

  • 一面------>挂掉
  • 一面------->二面------>挂掉
  • 一面------->二面------>三面------>挂掉
  • 一面------->二面------>三面------>入职

看是看着这种嵌套是真的恶心,这种问题就叫做回调地狱,这也是比较容易出现在异步中的问题,另外一个问题就是并发了,我们用同时面试两家公司为例,毕竟这也是正常能够出现的现象。

这时候张三说了:我会写我会写,还是上面代码的理念,我加一个计数器,面试过了就count++,count为2的时候,就证明两个面试都过了,这样可以用if判断并写一些逻辑。

简单描述一下张三的代码结构:

var count = 0;
interview(function (err) {
    if(err){
        return console.log('cry');
    }
    count++
})
interview(function (err) {
    if(err){
        return console.log('cry');
    }
    count++
    if(count){
        
    }
})

大致是这个样子,看起来很麻烦。这个问题就涉及到异步流程控制问题,也就是异步的并发,针对这个问题,我们强大的社区当然是有解决方案的。

  • npm包:async.js
  • thunk编程方式
现在好像这两个方式都不用了😭
相关文章
|
1月前
|
存储 JavaScript 前端开发
深入理解JavaScript中的事件循环(Event Loop):机制与实现
【10月更文挑战第12天】深入理解JavaScript中的事件循环(Event Loop):机制与实现
76 3
|
2月前
|
JavaScript 前端开发 API
详解队列在前端的应用,深剖JS中的事件循环Eventloop,再了解微任务和宏任务
该文章详细讲解了队列数据结构在前端开发中的应用,并深入探讨了JavaScript的事件循环机制,区分了宏任务和微任务的执行顺序及其对前端性能的影响。
|
15天前
|
存储 JavaScript 网络协议
浏览器与 Node 的事件循环
浏览器和Node.js的事件循环是异步操作的核心机制。它们通过管理任务队列和回调函数,确保程序在处理耗时任务时不会阻塞主线程,从而实现高效、响应式的应用开发。
|
20天前
|
JavaScript 前端开发 开发者
JavaScript的事件循环
【10月更文挑战第27天】理解JavaScript的事件循环机制对于正确编写和理解JavaScript中的异步代码至关重要,它是JavaScript能够高效处理各种异步任务的关键所在。
31 1
|
1月前
|
前端开发 JavaScript
深入理解JavaScript中的事件循环(Event Loop):从原理到实践
【10月更文挑战第12天】 深入理解JavaScript中的事件循环(Event Loop):从原理到实践
36 1
|
1月前
|
Web App开发 JavaScript 前端开发
深入理解Node.js事件循环和异步编程模型
【10月更文挑战第9天】在JavaScript和Node.js中,事件循环和异步编程是实现高性能并发处理的基石。本文通过浅显易懂的语言和实际代码示例,带你一探究竟,了解事件循环的工作原理及其对Node.js异步编程的影响。从基础概念到实际应用,我们将一步步解锁Node.js背后的魔法,让你的后端开发技能更上一层楼!
|
1月前
|
设计模式 JavaScript API
Node.js 事件循环
10月更文挑战第3天
30 0
Node.js 事件循环
|
1月前
|
JavaScript 调度 数据库
深入浅出:Node.js中的异步编程与事件循环
【9月更文挑战第30天】在Node.js的世界里,理解异步编程和事件循环是掌握其核心的关键。本文将通过浅显易懂的语言和实际代码示例,带你探索Node.js如何处理并发请求,以及它是如何在幕后巧妙地调度任务的。我们将一起了解事件循环的各个阶段,并学会如何编写高效的异步代码,让你的应用程序运行得更加流畅。
60 10
|
1月前
|
JavaScript 前端开发 开发者
深入理解Node.js中的事件循环和异步编程
【9月更文挑战第31天】本文旨在揭示Node.js背后的强大动力——事件循环机制,并探讨其如何支撑起整个异步编程模型。我们将深入浅出地分析事件循环的工作原理,以及它如何影响应用程序的性能和稳定性。通过直观的例子,我们会展示如何在实际应用中利用事件循环来构建高性能、响应迅速的应用。此外,我们还会讨论如何避免常见的陷阱,确保代码既优雅又高效。无论你是Node.js的新手还是经验丰富的开发者,本篇文章都将为你提供宝贵的洞察和实用技巧。
64 6
|
2月前
|
JavaScript 前端开发 API
Vue学习笔记3:对比纯JavaScript和Vue实现数据更新的实时视图显示
Vue学习笔记3:对比纯JavaScript和Vue实现数据更新的实时视图显示
下一篇
无影云桌面