资讯专栏INFORMATION COLUMN

nodejs异步编程详解

inapt / 2925人阅读

摘要:四异步编程解决方案模式模式一定程度上缓解了嵌套回调的问题,只会处在未完成完成态失败态中的一种,只会从未完成转化为完成态或者失败态,不能逆转。

一、从一个简单的案例开始
fs.readdir(path.join(__dirname, "./index.js"), (err, files) => {
    files.foreach((filename, index) => {
        fs.readFile((filename, "utf-8", (err, file) => {
            ...
        }))
    })
})

nodejs 特点是单线程、异步、非阻塞,如果代码逻辑涉及到多个回调,就会出现非常可怕的代码,不利于后期的维护。

二、 nodejs为什么会设计成异步编程?

异步编程是随着ajax才火的,所以最熟悉异步编程的就是前端工程师。但在其他编程语言中,异步并不多见,PHP从头到尾就是同步阻塞来执行的,这导致它在复杂的网络应用中无法更好的并发。当然我们并不是在批判PHP,毕竟PHP是世界上最好的语言。PHP代码设计成同步有利于程序员顺序编写业务逻辑,这个有点是不能忽视的。

js就是异步的,浏览器在执行js与UI渲染共用一个进程,如果js采用同步编程,会十分影响用户体验。为什么js不是多线程呢?首先创建线程和执行线程上下文切换的开销较大,其次多线程编程经常面临锁、状态同步等问题。js单线程的编写方式比较符合人按顺序思考的方式,是主流的编程方式。但是单线程无法对硬件资源充分的利用,node利用单线程,远离多线程、状态同步等问题,利用异步I/O,让单线程远离阻塞,以更好的利用CPU。node提供来类似于前端的Web Workers子进程来高效利用CPU。node基于事件循环的执行模式,使得回调函数十分普遍,对于一般的非异步的回调函数,函数由我们自行调用。

三、异步编程的难点

1.异常的处理

node通常会将异常作为回调函数的第一个实参传回,如果第一个参数为null,那么就说明异步调用没有异常抛出。

2.回调函数嵌套过深

开头的案例展示来多层回调的嵌套,导致代码非常难理解,但是现在可以通过 Promise、Generators、async函数解决。
其他还有多线程编程、异步转同步等。

四、异步编程解决方案

1.Promise/Deferred模式

Promise/Deferred模式一定程度上缓解了嵌套回调的问题,Promise只会处在未完成、完成态、失败态中的一种,只会从未完成转化为完成态或者失败态,不能逆转。且完成态和失败态不能相互转化。

Promise对象具备then方法,接受完成态、失败态的调用,只接受function对象,其余对象将被忽略。then方法继续返回Promise对象,以实现链式调用。

function asyncFunction() {
    return new Promise(function (resolve, reject) {
        setTimeout(function () {
            resolve("Async Hello world");
        }, 16);
    });
}

asyncFunction().then(function (value) {
    console.log(value);    // => "Async Hello world"
}).catch(function (error) {
    console.log(error);
});//基本的使用
更新中

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/82651.html

相关文章

  • nodejs 异步I/O和事件驱动

    摘要:异步和事件驱动注本文是对众多博客的学习和总结,可能存在理解错误。接触有两个月,对的两大特性一直有点模糊,即异步和事件驱动。 nodejs 异步I/O和事件驱动 注:本文是对众多博客的学习和总结,可能存在理解错误。请带着怀疑的眼光,同时如果有错误希望能指出。 接触nodejs有两个月,对nodejs的两大特性一直有点模糊,即异步IO和事件驱动。通过对《深入浅出nodejs》和几篇博客的阅...

    binaryTree 评论0 收藏0
  • Node.js知识点详解(一)基础部分

    摘要:基础的端到端的基准测试显示大约比快八倍。所谓单线程,就是指一次只能完成一件任务。在服务器端,异步模式甚至是唯一的模式,因为执行环境是单线程的,如果允许同步执行所有请求,服务器性能会急剧下降,很快就会失去响应。 模块 Node.js 提供了exports 和 require 两个对象,其中 exports 是模块公开的接口,require 用于从外部获取一个模块的接口,即所获取模块的 e...

    whjin 评论0 收藏0
  • 优秀文章收藏(慢慢消化)持续更新~

    摘要:整理收藏一些优秀的文章及大佬博客留着慢慢学习原文协作规范中文技术文档协作规范阮一峰编程风格凹凸实验室前端代码规范风格指南这一次,彻底弄懂执行机制一次弄懂彻底解决此类面试问题浏览器与的事件循环有何区别笔试题事件循环机制异步编程理解的异步 better-learning 整理收藏一些优秀的文章及大佬博客留着慢慢学习 原文:https://www.ahwgs.cn/youxiuwenzhan...

    JeOam 评论0 收藏0
  • node.js中文资料导航

    摘要:中文资料导航官网七牛镜像深入浅出系列进阶必读中文文档被误解的编写实战系列热门模块排行榜,方便找出你想要的模块多线程,真正的非阻塞浅析的类利用编写异步多线程的实例中与的区别管道拒绝服务漏洞高级编程业界新闻看如何评价他们的首次尝鲜程序员如何说服 node.js中文资料导航 Node.js HomePage Node官网七牛镜像 Infoq深入浅出Node.js系列(进阶必读) Nod...

    geekidentity 评论0 收藏0
  • JavaScript 异步

    摘要:从最开始的到封装后的都在试图解决异步编程过程中的问题。为了让编程更美好,我们就需要引入来降低异步编程的复杂性。写一个符合规范并可配合使用的写一个符合规范并可配合使用的理解的工作原理采用回调函数来处理异步编程。 JavaScript怎么使用循环代替(异步)递归 问题描述 在开发过程中,遇到一个需求:在系统初始化时通过http获取一个第三方服务器端的列表,第三方服务器提供了一个接口,可通过...

    tuniutech 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<