热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Node.js基础设计模式回调模式

引言回调是Node.js独特的编程风格印记。回调是被调用来传播操作结果的函数,这正是我们在处理异步操作时所需要的,它们会替代总是同步执行的return

引言

回调是Node.js独特的编程风格印记。回调是被调用来传播操作结果的函数,这正是我们在处理异步操作时所需要的,它们会替代总是同步执行的return指令。

Javascript是一种很好的表示回调的语言,因为如你所见,函数首先是类对象,可以很容易的分配给变量,作为参数传递,从另一个函数调用返回或储存到数据结构。

例如,在以往的语言特性中,我们总会认为return语句是一个函数的结束:

function add(a, b) {return a + b
}
console.log(add(2, 3)) //=> 5

但是Javascript可以将函数作为参数,形成一个作用域,而不仅仅是在一个函数中调用另一个函数那么简单

//CPS
function add(a, b, fn) {fn(a + b)return undefined //默认返回undefined
}
function csl(value) {console.log(value)
}
add(2, 3, csl) //=> 5

另一个实现回调的理想构造的闭包。使用闭包,我们实际上可以引用创建函数的环境,可以始终维持异步操作被请求时的上下文,不用关系他的回调被调用的实现或地点

CPS(Continuation Passing Style)

在Javascript中,回调是一个作为参数传递给另一个函数的函数,当操作完成时将调用该结果。在函数编程中,这种传播结果的方式被成为CPS。这是一个通用的概念,它并不总是与异步操作相关联,例如上面的一段代码就是同步CPS,与之相对的是异步CPS,

为了引入异步的CPS,我们再将上面的同步CPS函数稍微改造一下:

function add(a, b, fn) {fn(a + b)
}
console.log('before')
add(2, 3, (value) => console.log('value: ' + value))
console.log('after')/*输出:beforevalue: 5after
*/

事实上,如上的代码设计并没有特别的地方,现在考虑异步CPS的情况:

function add(a, b, fn) {setTimeout(() => {fn(a + b)}, 0)
}
console.log('before')
add(2, 3, (value) => console.log('value: ' + value))
console.log('after')
/*输出:beforeaftervalue: 5
*/

由于setTimeout是异步函数,它会等主线程执行完了再执行,因此是最后输出,异步CPS的价值就体现出来了

  • 作为回调函数,可以始终维持异步操作被请求时的上下文:
  • 作为异步函数,可以不阻塞地继续执行代码

在这里插入图片描述
实际上,CPS的影响和作用并非那么简单,随着我们对异步编程的逐渐深入,日后我们将会看到它的强大

非CPS回调

并非把函数当参数传进了另一个函数中就成为了GPS,在有些情况下,回调参数的存在可能会让我们认为这个函数是异步的或使用CPS,实际上并不总是这个样子

console.log([2, 4, 6, 8].map(it => it + 2)) //=> [ 4, 6, 8, 10 ]

这里的回调函数只是用来遍历数组元素的,CPS的一个重要特征是

  • 传递操作结果

是否使用回调通常会在API文档中清除地说明

下一篇:Node.js基础设计模式 — 观察者模式


推荐阅读
  • 开发笔记:Xunit测试使用个人小结
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Xunit测试使用个人小结相关的知识,希望对你有一定的参考价值。因工作中用到xunit测试,故总结下用法,以供个人参考使 ... [详细]
  • python3.5安装教程及环境配置_Eric6+PyQt5+Python3.5开发环境安装配置图文教程
    Python3.5.2(x32)是目前兼容较好的版本,可以搭配PyQt5的界面设计以及eric6的整合编程平台,达到不错的编 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • 浅解XXE与Portswigger Web Sec
    XXE与PortswiggerWebSec​相关链接:​博客园​安全脉搏​FreeBuf​XML的全称为XML外部实体注入,在学习的过程中发现有回显的XXE并不多,而 ... [详细]
  • Imdevelopinganappwhichneedstogetmusicfilebystreamingforplayinglive.我正在开发一个应用程序,需要通过流 ... [详细]
  • KVC:Key-valuecodingisamechanismforindirectlyaccessinganobject’sattributesandrelations ... [详细]
  • 前言:原本纠结于Web模板,选了Handlebars。后来发现页面都是弱逻辑的,不支持复杂逻辑表达式。几乎要放弃之际,想起了Javascript中ev ... [详细]
  • 在这一期的SendMessage函数应用中,我将向大家介绍如何利用消息函数来扩展树型列表(TreeView)控件的功能相信对于树型列表控件大家十分的熟悉, ... [详细]
  • NSSROUND#8[Basic]
    文章目录一、[NSSRound#8Basic]MyDoor二、[NSSRound#8Basic]Upload_gogoggo三、[NSSRound#8Basic]MyPage四、[ ... [详细]
  • Linux是一套免费使用和***传播的类UNIX操作系统,主要用于基于Intel x86系列CPU的计算机上。Linux系统是由全世界各地的成千上万的程序员合适的方式定制自己的Li ... [详细]
  • 图像处理(7) : 边缘检测
    边缘检测是图形图像处理、计算机视觉和机器视觉中的一个基本工具,通常用于特征提取和特征检测,旨在检测一张数字图像中有明显变化的边缘或者不连续的区域 ... [详细]
  • 在VS(VisualStudio)2017下编译C语言程序,如果使用了scanf()、gets()、strcpy()、strcat()等与 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了迭代数组的问题相关的知识,希望对你有一定的参考价值。我在浏 ... [详细]
  • AI 学习路线:从Python开始机器学习
    AI 学习路线:从Python开始机器学习 ... [详细]
author-avatar
小涵竹叶
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有