当前位置: 首页 > 后端技术 > Node.js

【书籍精读】《JavaScript异步编程》精读笔记分享

时间:2023-04-03 13:01:01 Node.js

写在前面书籍介绍:本书讲述了基本的异步处理技??巧,包括PubSub、事件模式、Promises等,通过这些技巧,你可以更好的处理大型规模的Web应用程序复杂的交互式代码,响应迅速。了解JavaScript的异步模式,可以让读者编写出结构更合理、性能更好、维护更方便的JavaScript程序。我的简评:一本关于js异步编程的科普小书,内容全面但不够深入。作为前端开发,了解异步处理机制,优化异步代码非常重要,特别推荐《JavaScript异步编程》。!!福利:文末有pdf书籍,笔记思维导图,以及随书代码包下载地址。阅读【书籍精读】系列所有文章,请前往:推荐收藏-JavaScript书籍精读笔记系列导航第1章深入理解JavaScript事件1.1.事件调度javascript代码是用来不被打断的,因为代码只需要将事件排队即可,直到1.2代码运行结束才会触发这些事件。异步函数的类型每个JavaScript环境都有自己的一组异步函数。在浏览器端,Ajax方法有一个async可以设置为false的选项SynchronizedAPI方法在Node.js中会明确标示在名称上。例如,fs.readFileSyncWebKit的console.log打印输出不会立即对对象进行快照,而只会存储对该对象的引用,并等待代码返回事件队列。打印快照,Node的console.log是严格同步的。当同一个JavaScript进程运行代码时,任何JavaScript计时函数都无法使其他代码运行。setInterval调度事件设置为0,chrome等浏览器的触发频率约为每秒200次,node换成while循环时约为每秒1000次,Chrome中的触发频率达到每秒400万次,而在node中会达到每秒500万次,需要更细粒度的计时。在node.nextTick中使用process,在现代浏览器1.3中使用requestAnimationFrame(思想兼容)。编写异步函数确认函数是否异步的唯一方法是查看其源代码。有些函数有时是异步的,但其他的如果时间不是很多延迟,就会造成巨大的计算负荷。异步递归有点吓人,就是在等待任务完成的过程中,可以触发的延迟次数是无限的。永远不要定义潜在的同步和返回值。回调的可能功能1.4。异步错误处理JavaScript还允许抛出异常,然后用try/catch块捕获异常。出于这个原因,Node.js中的回调几乎总是接受一个错误作为它们的第一个参数,它允许回调自行决定如何处理错误。永远记住,源自回调的异步错误只能在回调内部处理。在浏览器环境下,windows.onerror可以捕获异常,如果返回true,则可以阻塞浏览器。node中默认的错误处理行为类似于process对象的uncaughtException事件来捕获错误。正常情况下,node应用会因为未捕获的异常而立即退出,但是从Node0.8.4开始,uncaughtException事件被丢弃。域对象是一个基于事件的对象,它将抛出转换为错误事件。1.5.取消嵌套回调的嵌套最常见的反模式方法是在回调中嵌套回调。嵌套回调诱惑我们。通过添加更多代码来添加更多功能,而不是将这些功能实现为可管理、可重用的代码片段。按照惯例,请避免嵌套超过两层的函数。Chapter2DistributedEvents想用分布式事件:事件的蝴蝶偶然扇动翅膀,整个应用程序处处触发反应。PubSub表示发布/订阅,该模式用于分发事件。PubSub模式的一些具体表现:Node的EventEmitter对象,Backbone的事件模型,JQuery的自定义事件2.1。PubSub模式下的Node中几乎所有的I/O都是EventEmitter对象:文件流、HTTP服务器,甚至应用程序进程本身。事件处理程序本身无法知道它是从事件队列运行还是从应用程序代码运行。对于不需要立即发生的事件维护一个队列,并使用定时功能定期运行队列中的下一个任务PubSub简化了事件的命名、分发和累积2.2。基于事件的模型只要对象具有PubSub接口,就可以称为基于事件的对象事件循环。事件模型为我们带来了一种将应用程序状态变化转换为事件的直观方式2.3.jQuery自定义事件jQuery简化了将强大的分布式事件系统移植到任何Web应用程序的过程。jQuery提供了一种非冒泡的triggerHandler方法。jQuery的自定义事件允许与DOM相关的事件直接通过DOM表达,而不必使用DOM将改变的状态复制到应用程序的其他地方。总结PubSub模式尤其不适合一次性事件。用来解决一次性事件问题的工具叫做Promise。第3章Promise对象和Deferred对象3.1。Promise的简史Promise对象也与EventEmitter对象相关,同样,允许任意数量的处理器绑定同一个事件(堆栈技术)的最大好处是可以很容易地从现有的Promise对象派生出新的Promise。在一般用法中,Promise、Deferred、Future是这三个词,大致可以看成同义词3.2.生成Promise对象准确的说,Deffered是Promise的一个超集。它比Promise多了一个关键特性,可以直接Trigger重申一下:每个Deferred对象都包含一个Promise对象,每个Promise对象代表一个Deferred对象3.3.对这两种情况的处理方式不同。当向回调函数传递数据执行或拒绝Deferred对象时,提供的任何参数都会被转发给相应的回调resolve/reject可以直接将其上下文传递给自己触发的回调3.4.进度通知在jQuery1.7中,一个新的回调Promise对象中添加了可以调用无数次的progress。总之,Promise对象接受3种回调形式:done、fail、progress3.5Promise对象的合并Promise对象的逻辑合并该技术有一个最常见的用例:确定一组异步任务何时完成3.6.管道连接以后,往往无法方便地在JavaScript中执行一系列异步任务。任务附加处理器jQuery1.6增加了一个管道(pipeline)方法promise.promise()===promise3.7。jQuery与Promises/A的比较jQuery使用resolve作为fail的反义词,而Promise/A使用的是fulfill在Promise/A规范中,无论一个Promise对象是fulfilled还是failed,它总是fulfilled使得意大利面条式的回调变得顺畅,也因为Promise可以非常轻松的协调这类异步任务回调是按照调用的先后顺序触发的.waterfall的便利在于Async.js按照任务列表的顺序将结果传递给完成事件处理程序,而不是按照它们的生成顺序Async.js的核心和灵魂:简单且省时的工具最常见的异步场景功能4.4。异步工作流的动态排队技术。async.queue底层的基本概念让人联想到DMV动态管理视图Chapter5Multithreadingtechnologyforworkerobjects5.0。写在前面的事件可以代替一种特殊的多线程,即应用程序进程可以通过多线程技术拆分成多个同时运行的部分(可以通过中断技术虚拟实现,也可以通过多CPU核实实现)).虽然只在一个线程上运行确实不理想,但直接将应用程序分发是天真的多核更糟糕与不同线程交互与在JavaScript中进行I/O操作完全相同同一进程中的多个线程可以共享状态,而单独的进程不能在JavaScript环境中,由worker对象运行的并发代码从不共享状态基于Web的编辑器也是基于类似的原因。工作对象看不到全局窗口对象以及主线程和其他工作线程的任何对象。通过postMessage发送的对象将被透明地序列化和反序列化。想想JSON.parse和JSON.stringifyworker对象可以随意使用XMLHttpRequest。还有一个importScripts函数可以同步加载并运行指定的脚本。同端口API:cluster(集群)通常使用cluster为每个CPU核心区分一个进程,以追求最佳性能。Node版本的worker对象通过cluster.fork()重新加载,运行相同的脚本作为一个独立的进程浏览器可以将任何多余的线程降级为后台任务,而node服务器必须留出计算资源来保证其主要任务处理请求。最著名的魔法:当多个工作对象尝试监听一个TCP端口时,节点使用内部消息来允许共享端口。同样,集群对象有一个主线程和多个工作线程,基于一些带有序列化对象或附加字符串的事件。为了尽量减少线程间的通信开销,线程间共享的页面状态应该存储在像Redis这样的外部数据库中。第6章异步脚本加载需要分治脚本。后加载6.1。限制和补充说明请尽量避免使用内联技术,不要使用document.write,只要您知道在操作DOM时document.write等同于GOTO语句即可。标签分为两种新类型:经典和非阻塞流行。将脚本放在页面body标记的末尾。一方面,用户可以更快地看到页面,另一方面,他们可以主动和亲密地接触DOM,而无需等待事件自己触发。defer让我们想起一个有序的排队场景静静等待文档加载,然后async让我们想起混乱的无政府状态一个脚本同时使用了defer和async,在那些同时支持它的浏览器中,async会覆盖defer6.3。可编程脚本加载有两种合理的方式来获取和运行服务器脚本:生成Ajax请求并使用eval函数处理响应;将脚本标签插入到DOM中require.js强大的工具包可以与AMD技术一起自动平滑如果即使是最复杂的脚本依赖关系图也需要有条件地加载脚本,请考虑像yepnope这样的脚本加载器。如果站点有很多相互依赖的脚本,请考虑后面pdf书中写的require.js,笔记的思维导图,以及随书的代码包下载地址:https://pan.baidu.com/s/1WMzAciLMfTasiWFQjz4ftA(提取码:wd01)纸质书京东购买地址:https://u.jd.com/e0BT68(推荐使用纸质书学习)为了方便手机查看,我将这些笔记贴到公众号“拍三拍”四,可以扫描二维码关注,欢迎关注。