Node.js Continuation Passing Style( CPS与回调)

目录
  • 前言
  • 嵌套回调
  • 回调地狱
  • 回调与CPS

前言

前面我们介绍了node的基础模块,今天我们来实践一个更加进阶的写法,那就是node的异步处理,由于过多的事件堆积在一起嵌套使用容易引起回调地狱,所以在日常开发中异步的使用显得异常的重要,在开发中我们也经常会遇到某些接口需要先后调用的问题,那么异步是一个很好的解决方案,所以今天来给这个知识点做一个笔记。

嵌套回调

我们先用一个小栗子,书写一个方法接受一个参数并将参数读取的数据返回,简单来封装一个文件读取的方法。

var fs = require('fs');
function read(path){
    fs.readFile(path,function(err,data){
        return data;
    })
}
let a = read('a.txt');
console.log(a);
//如果存在多个需要读取的文件,而由于各个文件的大小不相同,可能读取的速度也不同,这样的话可能会导致执行后返回的顺序不一样,但如果我们需要读取的文件是有顺序的,那这样就会造成一些问题了
read(a.txt)
read(b.txt)
read(c.txt)

回调地狱

如果我们不用异步进行解决,我们需要在读取b文件之前需要用到a文件之间的某些信息,那么我们是需要在a文件读取完成之后再进行执行读取b的操作,通常是这么写的

fs.readFile(path,function(err,data){
        console.log(data);
        fs.readFile(Path2D,function(err,data){
            console.log(data);
        })
    })

如果我们只是单纯的这么写,看上去确实是没有问题的,因为我们只需要用来读取来个文件,但如果文件相互依赖比较多的话,需要用到的嵌套回调会更多,这样就会形成所谓的回调地狱的问题。不仅嵌套的层数增加,代码的可维护性也变得更低

回调与CPS

将回调函数作为参数传递,这种书写方式通常被称为Continuation Passing Style(CPS),它的本质仍然是一个高阶函数,CPS最初是各大语言中对排序算法的实现。

CPS风格回调:

var callBack = function(err,data){
    if(err){
        console.log(err);
    }
    console.log(data.toString());//666

}
fs.readFile('./异步/aaa.txt',callBack);

如果重复调用了readFile都是同一个回调的话,那么CPS可以帮我们节省掉很多的代码,如果是多个回调不相同的情况下,CPS可以在一定程度上解决回调嵌套的问题

var callBack = function(err,data){
    if(err){
        console.log(err);
    }else{
        fs.readFile('./异步/a2.txt',callBack2);
    }

}
var callBack2 = function(err,data){
    if(err){
        console.log(err);
    }else{
        fs.readFile('./异步/a3.txt',callBack3);
    }

}
var callBack3 = function(err,data){
    if(err){
        console.log(err);
    }else{
        // fs.readFile('./异步/a3.txt',callBack3);
    }

}
fs.readFile('./异步/a1.txt',callBack);

我们可以看出来CPS的回调比嵌套回调更加的美观一点,但是业务逻辑仍然散发在不同的callback中,代码还是会显得比较冗余,我们下一节来看一下async模块对回调的简化

到此这篇关于Node.js Continuation Passing Style( CPS与回调)的文章就介绍到这了,更多相关Node.js CPS回调内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 深入理解Node.js 事件循环和回调函数

    本文详细的介绍了Node.js 事件循环和Node.js回调函数,废话不多说了,具体看下面把.  一.Node.js 事件循环 Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高.Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发.Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现.Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观

  • 我的Node.js学习之路(三)--node.js作用、回调、同步和异步代码 以及事件循环

    一,node.js的作用, I/O的意义,(I/O是输入/输出的简写,如:键盘敲入文本,输入,屏幕上看到文本显示输出.鼠标移动,在屏幕上看到鼠标的移动.终端的输入,和看到的输出.等等)   node.js想解决的问题,(处理输入,输入,高并发 .如 在线游戏中可能会有上百万个游戏者,则有上百万的输入等等)(node.js适合的范畴:当应用程序需要在网络上发送和接收数据时Node.js最为适合.这可能是第三方的API,联网设备或者浏览器与服务器之间的实时通信)   并发的意义,(并发这个术语描述的

  • node.js回调函数之阻塞调用与非阻塞调用

    首先,node.js作为javascript运行平台,它采用了事件驱动和异步编程的方式,通过事件注册和异步函数,开发人员可以提高资源利用率,服务器的性能也能得到改善.其次,对于前端人来说,node.js作为js的运行平台,我们可以通过编写系统级或者服务器端的javascript代码交给node.js来执行,让我们前端人也能作用于后台,相比之下,浏览器端的javascript代码在运行时会受到各种安全性的限制,对客户系统的操作有限,而node.js则是一个全面的后台运行时,为javascript提

  • Node.js 回调函数实例详解

    Node.js 回调函数 阻塞与非阻塞 node.js 异步编程的直接体现就是回调. 异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了. 回调函数在完成任务后就会被调用,Node 使用了大量的回调函数,Node 所有 API 都支持回调函数. 阻塞代码实例(同步函数) //阻塞是按顺序执行的 var fs = require("fs"); var data = fs.readFileSync('input.txt'); console.log(data.toString()

  • 剖析Node.js异步编程中的回调与代码设计模式

    NodeJS 最大的卖点--事件机制和异步 IO,对开发者并不是透明的.开发者需要按异步方式编写代码才用得上这个卖点,而这一点也遭到了一些 NodeJS 反对者的抨击.但不管怎样,异步编程确实是 NodeJS 最大的特点,没有掌握异步编程就不能说是真正学会了 NodeJS.本章将介绍与异步编程相关的各种知识. 在代码中,异步编程的直接体现就是回调.异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了.我们首先可以看看以下代码. function heavyCompute(n, callb

  • Node.js基础入门之回调函数及异步与同步详解

    目录 回调函数 1. 什么是回调函数? 2. 回调函数实现机制 3. 回调函数用途 4. 回调函数示例 异步与同步 1. 什么是异步与同步? 2. 同步示例 3. 异步示例一 4. 异步示例二 异步的实现 1. 回调函数的同步示例 2. 异步事件示例 3. 异步示例截图 Promise基础 1. 什么是Promise ? 2. Promise特点 3. 异步的缺点 4. Promise保证异步顺序 经过前面两天的学习,已经对Node.js有了一个初步的认识,今天继续学习其他内容,并加以整理分享,

  • node.js实现回调的方法示例

    本文实例讲述了node.js实现回调的方法.分享给大家供大家参考,具体如下: 向回调函数传递额外的参数 在调用函数中,使用匿名函数中实现需传递的参数,再次匿名函数内调用回调函数. var events = require("events"); function CarShow() { events.EventEmitter.call(this); this.seeCar = function (make) { this.emit('sawCar', make); } } CarShow

  • 如何将Node.js中的回调转换为Promise

    前言 在几年前,回调是 JavaScript 中实现执行异步代码的唯一方法.回调本身几乎没有什么问题,最值得注意的是"回调地狱". 在 ES6 中引入了 Promise 作为这些问题的解决方案.最后通过引入   async/await 关键字来提供更好的体验并提高了可读性. 即使有了新的方法,但是仍然有许多使用回调的原生模块和库.在本文中,我们将讨论如何将 JavaScript 回调转换为 Promise.ES6 的知识将会派上用场,因为我们将会使用 展开操作符之类的功能来简化要做的事

  • Node.js Continuation Passing Style( CPS与回调)

    目录 前言 嵌套回调 回调地狱 回调与CPS 前言 前面我们介绍了node的基础模块,今天我们来实践一个更加进阶的写法,那就是node的异步处理,由于过多的事件堆积在一起嵌套使用容易引起回调地狱,所以在日常开发中异步的使用显得异常的重要,在开发中我们也经常会遇到某些接口需要先后调用的问题,那么异步是一个很好的解决方案,所以今天来给这个知识点做一个笔记. 嵌套回调 我们先用一个小栗子,书写一个方法接受一个参数并将参数读取的数据返回,简单来封装一个文件读取的方法. var fs = require(

  • Node.js实现链式回调

    由于异步的关系,代码的书写顺序可能和执行顺序并不一样,可能想先执行A再执行B,但由于异步可能B要先于A执行.例如在OC中使用AFnetworking请求数据然后刷新页面,由于网络请求是用block实现的异步方法,所以刷新的时候并没有数据,为了解决这个问题,一般会在请求响应结束在block中刷新页面(这就回出现循环引用的问题,不过node中不会出现). 上面是OC中异步执行中的链式回调,在node.js中也是使用这样的方法在回调中调用方法来实现链式回调. function logCar(car,c

  • 详解Node.js中的事件机制

    前言 在前端编程中,事件的应用十分广泛,DOM上的各种事件.在Ajax大规模应用之后,异步请求更得到广泛的认同,而Ajax亦是基于事件机制的. 通常js给我们的第一印象就是运行在客户端浏览器上面的脚本,通过node.js我们可以在服务端运行javascript. node.js是基于单线程无阻塞异步式的I/O,异步式的I/O指的是当遇到I/O操作的时候,线程不阻塞而是进行下面的操作,那么I/O操作完成之后,线程时如何知道该操作完成的呢? 当操作完成耗时的I/O操作之后,会以事件的形式通知I/O操

随机推荐