node.js中cps风格中的同步和异步的差异
程序员文章站
2022-04-17 18:54:52
...
node.js中cps风格
重点讲到的是回调,回调可以无限极回调,将前几位参数值的结果,传给最后一个函数,其中回调的最后一个参数,是一个函数,函数回调
其中异步中,是将函数的回调部分,增加了一个定时器进行操作,让当前的返回给函数的值,扔到次线程
回调参数一定是在末尾
以及错误优先
直接上代码部分:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>csp工作原理</title>
</head>
<body>
<script>
//node中低层设计模式:回调与异步
//传统模式
function add1(a, b) {
// return是直接返回给调用者
return a + b;
}
console.log(add1(1, 3));
console.log("------------");
// Cps风格
// callback,必须是参数列中的最后一位参数
function add2(a, b, callback) {
// 结果直接返回给回调 回调给第三位参数
//也就是a+b的结果并不直接返回调用者,而是传给了另外一个回调函数执行,在这个函数中,感觉是一个参数值
callback(a + b);
}
console.log("--------cps同步执行---------");
//但是在输出结果的时候,是一个函数,函数输出的部分,就是函数自己本身
add2(1, 2, call => console.log(call));
console.log("---------cps同步执行结束----------");
///////////cps异步风格,我感觉就是把输出的函数,放到了定时器中执行了,然后就是异步了/////
function add3(a, b, callback) {
setTimeout(() => {
// 异步风格是将回调部分,在回调时,转为了异步
callback(a + b);
}, 300);
}
console.log("------异步风格----------");
//异步不在主线程执行
add3(1, 2, ad => console.log(ad));
console.log("------异步风格结束-------");
// 异步: 代码书写顺序与执行顺序不一致, 乱序执行
// Node中几乎每个API都使用了CPS异步风格来执行,遵循2个约定
// 1. 回调结尾: 回调参数始终是函数的最后一个参数
// 2. 错误优先: 回调传参时, 错误永远是第一个参数
</script>
</body>
</html>
示例截图:
node模块系统
模块的导出使用代码module.exports
/exports
模块的导入由代码require
导入
核心模块
核心模块其中2类:http
模块 web模块fs
文件模块
// node模块
//node模块风格-commonjs
//node模块跟js模块类似一样,node风格就是commonjs 他的内部成员全部私有,只有导出才可以被访问使用
// node模块三大类
//1.核心模块,开箱即用
//2.文件模块,自己写,并且要导入
//3.第三方模块,需要自己导入使用
/////////核心模块//////////无需声明直接使用///
const http = require("http");
console.log(http);
///显示所有的http模块内可以使用的api
const fs = require("fs");
console.log(fs);
// fs模块是调佣文件的模块,比如可以复制,剪切对文件的操作,下面也是内置的一些api
示例截图:
dome1.html演示,主要是导出模块至本html
模块的导出使用代码module.exports
/exports
模块的导入由代码require
导入
// node模块
//node模块风格-commonjs
//node模块跟js模块类似一样,node风格就是commonjs 他的内部成员全部私有,只有导出才可以被访问使用
// node模块三大类
//1.核心模块,开箱即用
//2.文件模块,自己写,并且要导入
//3.第三方模块,需要自己导入使用
/////////核心模块//////////无需声明直接使用///
const http = require("http");
console.log(http);
///显示所有的http模块内可以使用的api
const fs = require("fs");
console.log(fs);
// fs模块是调佣文件的模块,比如可以复制,剪切对文件的操作,下面也是内置的一些api
///////文件模块//////////需要声明再导入才能使用/////
// 导入刚刚写的文件模块
// 这里需要使用require导入模块
let site = require("./m1.js");
console.log(site);
//访问模块内的方法及参数
console.log(site.getname());
//////使用module.exports导入//////
site = require("./m2.js");
console.log(site);
// 根据m1.js跟m2.js中看的出,exports可以导出多个,而module.exports可以导出多个
m1.js打包的模块是简体exports导出多个模块的演示
//文件模块,也就是自定义模块
//使用 exports:导出多个
//1:逐个导出
// exports为简写
exports.niuniu = 1;
exports.niu = function (a, b) {
return a + b;
};
exports.name = "php.中文网";
exports.domain = "www.php.cn";
exports.getname = function () {
///与其他的name domain a niuniu等为上线文关系,看不明白就把上面的内容放到{}对象里面,秒懂
return ` ${this.name}网址为:${this.domain}`;
};
//如何使用文件模块呢? 需要导入一下,先导入到同目录下的dom1node模块.js文件里面吧
/////////上面为单个导出////////////
////////统一导出示例////////////
// 先声明几个
// exports导出风格
let name = "php.中文网";
let domain = "www.php.cn";
let getname = function () {
///与其他的name domain a niuniu等为上线文关系,看不明白就把上面的内容放到{}对象里面,秒懂
return ` ${this.name}网址为:${this.domain}`;
};
exports.name = name;
exports.domain = domain;
exports.getname = getname;
// 写完之后到控制台输出,发现还是一样的结果
m2.js主要是使用非简体写法,module.exports导出模块成员的方法
// 导出模块成员 module.exports
// module.exports 属于完整语法 exports是完整语法的简化
let name = "php.中文网";
let domain = "www.php.cn";
let getname = function () {
///与其他的name domain a niuniu等为上线文关系,看不明白就把上面的内容放到{}对象里面,秒懂
return ` ${this.name}网址为:${this.domain}`;
};
module.exports.name = name;
module.exports.domain = domain;
module.exports.getname = getname;
//////第一步简写方法///
// module.exports = { name: name, domain: domain, getname: getname };
// 当上面的满足条件时,还可以简写
module.exports = { name, domain, getname };
//进一步简化,放入对象中打包处理
module.exports = {
name = "php.中文网",
domain = "www.php.cn",
getname() {
///与其他的name domain a niuniu等为上线文关系,看不明白就把上面的内容放到{}对象里面,秒懂
return ` ${this.name}网址为:${this.domain}`,
};
////////////////////////////////////////////////////////////////////
演示node.js创建服务器发起http请求示例:
本案例使用node.js插件node-snippets来实现的代码块
代码示例:
//http模块
const http = require("http");
//导入http模块
http
// .createServer(function (request, response) {
// response.writeHead(200, { "Content-Type": "text/html" });
// response.end("<h2> Hello World</h2>");
// 下面改为json格式
.createServer(function (request, response) {
response.writeHead(200, { "Content-Type": "application/json" });
response.end(`
{
"name":"",
"id":1232,
"qqemail":"12344567@qq.com"
}
`);
})
.listen(8081);
// 这里可以简化处理
// 直接使用.liston(8081,()=>console.log("Server running at http://127.0.0.1:8081/"))
console.log("Server running at http://127.0.0.1:8081/");
// 默认输出的是文本模式,当输出html格式时,把"text/plain"文档类型这里改为"text/html" 立马渲染到了html页面
// 返回html更改为"text/html"
// 返回json更改为"application/json"
示例截图:
文件模块的中同步执行文件/异步执行文件
文件模块示例代码:本案例使用node.js插件node-snippets来实现的代码块
__dirname
读取目录
//文件模块
// node-file-read-async 异步读取
// node-file-read-sync 同步读取
console.log(__dirname); //读取当前项目地址
// var fs = require("fs");
fs.readFile(__dirname + "/niuniu.txt", function (err, data) {
if (err) return console.error(err);
console.log(data.toString());
});
示例截图:
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 |
下面有具体的代码示例,可以比对截图查看 |
代码部分:
// path模块 解析路径
const str = "./node/hello.js";
// 拿到模块数据 赋值一个变量
const path = require("path");
// 拿到绝对路径
console.log(path.resolve(str));
//目录部分
//只拿到目录
console.log(path.dirname(str));
//查看文件名
console.log(path.basename(str));
//扩展名
console.log(path.extname(str));
//路径转成对象 pathstr转成 obj对象
console.log(path.parse(str));
//对象转成路径 obj对象转成pathstr
const obj = {
root: "",
dir: "./node",
base: "hello.js",
ext: ".js",
name: "hello",
};
console.log(path.format(obj));
示例截图: