欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

node.js中cps风格中的同步和异步的差异

程序员文章站 2022-03-27 09:09:33
...

node.js中cps风格
重点讲到的是回调,回调可以无限极回调,将前几位参数值的结果,传给最后一个函数,其中回调的最后一个参数,是一个函数,函数回调
其中异步中,是将函数的回调部分,增加了一个定时器进行操作,让当前的返回给函数的值,扔到次线程
回调参数一定是在末尾
以及错误优先
直接上代码部分:

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>csp工作原理</title>
  7. </head>
  8. <body>
  9. <script>
  10. //node中低层设计模式:回调与异步
  11. //传统模式
  12. function add1(a, b) {
  13. // return是直接返回给调用者
  14. return a + b;
  15. }
  16. console.log(add1(1, 3));
  17. console.log("------------");
  18. // Cps风格
  19. // callback,必须是参数列中的最后一位参数
  20. function add2(a, b, callback) {
  21. // 结果直接返回给回调 回调给第三位参数
  22. //也就是a+b的结果并不直接返回调用者,而是传给了另外一个回调函数执行,在这个函数中,感觉是一个参数值
  23. callback(a + b);
  24. }
  25. console.log("--------cps同步执行---------");
  26. //但是在输出结果的时候,是一个函数,函数输出的部分,就是函数自己本身
  27. add2(1, 2, call => console.log(call));
  28. console.log("---------cps同步执行结束----------");
  29. ///////////cps异步风格,我感觉就是把输出的函数,放到了定时器中执行了,然后就是异步了/////
  30. function add3(a, b, callback) {
  31. setTimeout(() => {
  32. // 异步风格是将回调部分,在回调时,转为了异步
  33. callback(a + b);
  34. }, 300);
  35. }
  36. console.log("------异步风格----------");
  37. //异步不在主线程执行
  38. add3(1, 2, ad => console.log(ad));
  39. console.log("------异步风格结束-------");
  40. // 异步: 代码书写顺序与执行顺序不一致, 乱序执行
  41. // Node中几乎每个API都使用了CPS异步风格来执行,遵循2个约定
  42. // 1. 回调结尾: 回调参数始终是函数的最后一个参数
  43. // 2. 错误优先: 回调传参时, 错误永远是第一个参数
  44. </script>
  45. </body>
  46. </html>

示例截图:
node.js中cps风格中的同步和异步的差异

node模块系统

模块的导出使用代码module.exports/exports
模块的导入由代码require 导入
核心模块
核心模块其中2类:
http模块 web模块
fs文件模块

  1. // node模块
  2. //node模块风格-commonjs
  3. //node模块跟js模块类似一样,node风格就是commonjs 他的内部成员全部私有,只有导出才可以被访问使用
  4. // node模块三大类
  5. //1.核心模块,开箱即用
  6. //2.文件模块,自己写,并且要导入
  7. //3.第三方模块,需要自己导入使用
  8. /////////核心模块//////////无需声明直接使用///
  9. const http = require("http");
  10. console.log(http);
  11. ///显示所有的http模块内可以使用的api
  12. const fs = require("fs");
  13. console.log(fs);
  14. // fs模块是调佣文件的模块,比如可以复制,剪切对文件的操作,下面也是内置的一些api

示例截图:
node.js中cps风格中的同步和异步的差异
node.js中cps风格中的同步和异步的差异

dome1.html演示,主要是导出模块至本html

模块的导出使用代码module.exports/exports
模块的导入由代码require 导入

  1. // node模块
  2. //node模块风格-commonjs
  3. //node模块跟js模块类似一样,node风格就是commonjs 他的内部成员全部私有,只有导出才可以被访问使用
  4. // node模块三大类
  5. //1.核心模块,开箱即用
  6. //2.文件模块,自己写,并且要导入
  7. //3.第三方模块,需要自己导入使用
  8. /////////核心模块//////////无需声明直接使用///
  9. const http = require("http");
  10. console.log(http);
  11. ///显示所有的http模块内可以使用的api
  12. const fs = require("fs");
  13. console.log(fs);
  14. // fs模块是调佣文件的模块,比如可以复制,剪切对文件的操作,下面也是内置的一些api
  15. ///////文件模块//////////需要声明再导入才能使用/////
  16. // 导入刚刚写的文件模块
  17. // 这里需要使用require导入模块
  18. let site = require("./m1.js");
  19. console.log(site);
  20. //访问模块内的方法及参数
  21. console.log(site.getname());
  22. //////使用module.exports导入//////
  23. site = require("./m2.js");
  24. console.log(site);
  25. // 根据m1.js跟m2.js中看的出,exports可以导出多个,而module.exports可以导出多个
m1.js打包的模块是简体exports导出多个模块的演示
  1. //文件模块,也就是自定义模块
  2. //使用 exports:导出多个
  3. //1:逐个导出
  4. // exports为简写
  5. exports.niuniu = 1;
  6. exports.niu = function (a, b) {
  7. return a + b;
  8. };
  9. exports.name = "php.中文网";
  10. exports.domain = "www.php.cn";
  11. exports.getname = function () {
  12. ///与其他的name domain a niuniu等为上线文关系,看不明白就把上面的内容放到{}对象里面,秒懂
  13. return ` ${this.name}网址为:${this.domain}`;
  14. };
  15. //如何使用文件模块呢? 需要导入一下,先导入到同目录下的dom1node模块.js文件里面吧
  16. /////////上面为单个导出////////////
  17. ////////统一导出示例////////////
  18. // 先声明几个
  19. // exports导出风格
  20. let name = "php.中文网";
  21. let domain = "www.php.cn";
  22. let getname = function () {
  23. ///与其他的name domain a niuniu等为上线文关系,看不明白就把上面的内容放到{}对象里面,秒懂
  24. return ` ${this.name}网址为:${this.domain}`;
  25. };
  26. exports.name = name;
  27. exports.domain = domain;
  28. exports.getname = getname;
  29. // 写完之后到控制台输出,发现还是一样的结果
m2.js主要是使用非简体写法,module.exports导出模块成员的方法
  1. // 导出模块成员 module.exports
  2. // module.exports 属于完整语法 exports是完整语法的简化
  3. let name = "php.中文网";
  4. let domain = "www.php.cn";
  5. let getname = function () {
  6. ///与其他的name domain a niuniu等为上线文关系,看不明白就把上面的内容放到{}对象里面,秒懂
  7. return ` ${this.name}网址为:${this.domain}`;
  8. };
  9. module.exports.name = name;
  10. module.exports.domain = domain;
  11. module.exports.getname = getname;
  12. //////第一步简写方法///
  13. // module.exports = { name: name, domain: domain, getname: getname };
  14. // 当上面的满足条件时,还可以简写
  15. module.exports = { name, domain, getname };
  16. //进一步简化,放入对象中打包处理
  17. module.exports = {
  18. name = "php.中文网",
  19. domain = "www.php.cn",
  20. getname() {
  21. ///与其他的name domain a niuniu等为上线文关系,看不明白就把上面的内容放到{}对象里面,秒懂
  22. return ` ${this.name}网址为:${this.domain}`,
  23. };

////////////////////////////////////////////////////////////////////


演示node.js创建服务器发起http请求示例:

本案例使用node.js插件node-snippets来实现的代码块
代码示例:

  1. //http模块
  2. const http = require("http");
  3. //导入http模块
  4. http
  5. // .createServer(function (request, response) {
  6. // response.writeHead(200, { "Content-Type": "text/html" });
  7. // response.end("<h2> Hello World</h2>");
  8. // 下面改为json格式
  9. .createServer(function (request, response) {
  10. response.writeHead(200, { "Content-Type": "application/json" });
  11. response.end(`
  12. {
  13. "name":"",
  14. "id":1232,
  15. "qqemail":"12344567@qq.com"
  16. }
  17. `);
  18. })
  19. .listen(8081);
  20. // 这里可以简化处理
  21. // 直接使用.liston(8081,()=>console.log("Server running at http://127.0.0.1:8081/"))
  22. console.log("Server running at http://127.0.0.1:8081/");
  23. // 默认输出的是文本模式,当输出html格式时,把"text/plain"文档类型这里改为"text/html" 立马渲染到了html页面
  24. // 返回html更改为"text/html"
  25. // 返回json更改为"application/json"

示例截图:
node.js中cps风格中的同步和异步的差异

文件模块的中同步执行文件/异步执行文件

文件模块示例代码:
本案例使用node.js插件node-snippets来实现的代码块
__dirname读取目录

  1. //文件模块
  2. // node-file-read-async 异步读取
  3. // node-file-read-sync 同步读取
  4. console.log(__dirname); //读取当前项目地址
  5. // var fs = require("fs");
  6. fs.readFile(__dirname + "/niuniu.txt", function (err, data) {
  7. if (err) return console.error(err);
  8. console.log(data.toString());
  9. });

示例截图:
node.js中cps风格中的同步和异步的差异

path路径模块
参数 示例 说明
resolve path.resolve(str) 拿到绝对路径
dirname path.dirname(str) 拿到目录
basename path.basename(str) 拿到文件名
extname path.extname(str) 拿到扩展名
parse path.parse(str) 路径转obj对象
format path.format(obj) 对象转obj
下面有具体的代码示例,可以比对截图查看

代码部分:

  1. // path模块 解析路径
  2. const str = "./node/hello.js";
  3. // 拿到模块数据 赋值一个变量
  4. const path = require("path");
  5. // 拿到绝对路径
  6. console.log(path.resolve(str));
  7. //目录部分
  8. //只拿到目录
  9. console.log(path.dirname(str));
  10. //查看文件名
  11. console.log(path.basename(str));
  12. //扩展名
  13. console.log(path.extname(str));
  14. //路径转成对象 pathstr转成 obj对象
  15. console.log(path.parse(str));
  16. //对象转成路径 obj对象转成pathstr
  17. const obj = {
  18. root: "",
  19. dir: "./node",
  20. base: "hello.js",
  21. ext: ".js",
  22. name: "hello",
  23. };
  24. console.log(path.format(obj));

示例截图:
node.js中cps风格中的同步和异步的差异