node是什么?
  • Node.js是一个能够在服务器端运行JavaScript的开放源代码、跨平台的JavaScript运行环境
  • Node采用Google开发的V8引擎来运行Js代码,使用事件驱动、非阻塞和异步I/O模型等技术来提高性能,可优化应用程序的传输量和规模
    node服务常用命令小记
    1、项目热启动方式:

nodejs模块化

global属性

在node中有个全局对象global,它的作用和网页中的window类似,在全局中创建的变量都会作为global的属性保存
在全局中创建的函数都会作为global的方法保存

nodejs的模块

本质上上是一个函数。函数具有属性arguments。我们可以通过arguments.callee来查看函数体内容

  1. //定义一个最简单的模块,我们打印看看结果
  2. a = 10;
  3. console.log(global.a);
  4. console.log(arguments.callee+'');

输出结果如下:

  1. function (exports, require, module, __filename, __dirname) {
  2. // 当用var修饰时,变量就不是全局变量
  3. a = 10;
  4. console.log(global.a);
  5. console.log(arguments.callee+'');
  6. }

因为模块中的代码都是包装到了一个函数里,所以里面的变量都是局部变量
分析一下参数的含义

  • exports
    该对象用来将变量或函数暴露到外部
  • require
    函数,用来引入外部的模块
  • module
    - module代表的是当前模块本身
    - exports就是module的属性
    - 既可以用exports导出,也可以使用module.exports导出
  • __filename
    - 代表的是当前文件路径
  • __dirname
    - 代表的是当前文件夹路径

数据类新和存储位置

1、基本数据类型
常用的有:String、Number、Boolean、Null、Undefined
基本数据类型存放在栈内存中
2、引用数据类型
常用的有:Object、Array、Function

NodeJs包

包结构
  • 包实际上就是一个压缩文件,解压以后还原为目录。符合规范的目录,应该包含如下文件:
    - package.json 描述文件,必须有
    - bin 可执行二进制文件
    - lib js代码
    - doc 文档
    - test 单元测试

    npm(Node Package Manager)

  • 包管理工具

  • npm命令
    - npm -v 查看npm的版本
    - npm version 查看所有模块的版本
    - npm search 包名 搜索包
    - npm install/i 包名 安装包
    - npm remove/r 包名 删除包
    - npm install 包名 —save 安装包并添加到依赖中
    - npm install 下载当前项目所依赖的包
    - npm install 包名 -g 全局安装包
  • node_modules文件夹
    - node在使用模块名字来引入模块时,它首先在当前目录的node_modules中寻找是否含有该模块
    如果有则直接使用,如果没有则取上一级目录的node_modules中寻找
    反复向上一级查找node_modules直到找到为止,如果一直到磁盘根目录都没找到,则报错
    buffer缓冲区

async await处理异步

1、let,const是一个块级作用域
2、箭头函数

  1. setTimeout(function(){
  2. console.log('信息')
  3. },1000)
  4. //箭头函数简写形式
  5. setTimeout( () => {
  6. console.log('信息')
  7. },1000)

3、promise的使用

  1. function getData(){
  2. setTimeout( () => {
  3. var name = '张三'
  4. },1000)
  5. return name
  6. }
  7. console.log(getData())
  8. //这是控制台会报错
  9. //当修改成如下代码时
  10. function getData(){
  11. setTimeout( () => {
  12. var name = '张三'
  13. return name
  14. },1000)
  15. }
  16. console.log(getData())
  17. //控制台会显示undefined,主要是因为异步引起的,当遇到{}时调用就会结束,但这时因为定时任务并没有结束,所以没有返回值
  18. //解决方法:通过回调函数获取数据
  19. function getData(callbck){
  20. setTimeout( () => {
  21. var name = '张三'
  22. callbck(name)
  23. },1000)
  24. }
  25. //将callbck当做函数传递进去,然后得到想要的数据
  26. getData(function(parm){
  27. console.log(parm)
  28. })
  29. //用promise解决异步问题的方法
  30. //resolve执行成功的回调函数,reject执行失败的回调函数
  31. var p = new Promise(function(resolve,reject) => {
  32. setTimeout( () => {
  33. var name = '张三'
  34. resolve(name)
  35. },1000);
  36. })
  37. //获取数据
  38. p.then(function(data){
  39. console.log(data)
  40. })
  41. //将promise中的function进行封装
  42. function getData(resolve,reject){
  43. setTimeout( () => {
  44. var name = '张三'
  45. resolve(name)
  46. },1000);
  47. }
  48. var p = new Promise(getData)
  49. p.then((data) => {
  50. console.log(data)
  51. })

3、async await 的含义
async是异步的简写,await是async 和 wait的简写。所以可以理解为async用于申明一个异步的function,而await用于等待一个异步方法执行完成
async:让一个方法变成异步
await:等待异步方法执行完成

4、JavaScript为什么要有异步方法?
因为js是单线程,同一时间只能做同一件事,当遇到等待就会卡住,而异步不会阻塞代码执行,可以提高效率

5、async和await的使用

  1. //先看代码
  2. async function test(){
  3. console.log('你好zce');
  4. return '返回值'
  5. }
  6. console.log( test() );//我们返回的是一个Promise对象
  7. //如果想拿到字符串我们该怎么做呢?
  8. async function test(){
  9. return '返回值'
  10. }
  11. // console.log( await test() )//会报错:因为await只能在异步方法里面使用
  12. async function get(){
  13. //注意await必需用在异步方法里面
  14. console.log(await test())
  15. }
  16. get()

Promise的原理

1、promise状态、结果、参数

Promise是一个构造函数,通过new 关键字实例化对象
语法:

  1. new Promise((resolve,reject)=>{})
  • Promise接受一个函数作为参数
  • 参数函数中接受两个参数

    2、Promise的实例有两个很重要的属性
  • state:状态

  • result:结果

3、Promise的状态

  • 第一种状态:pending(准备,待解决,进行中)
  • 第二种状态:fulfilled(已完成,成功)
  • 第三种状态:rejected(已拒绝,失败)

4、promise状态的改变

  1. const p = new Promise((resolve,reject) => {
  2. resolve() //调用resolve将Promise状态改成fulfilled
  3. reject() //调用reject将状态改成rejected,但是因为状态只能改变一次,所以这个改变不起作用
  4. })
  5. console.dir(p)

promise的状态的改变是一次性的,也就是说resolve()和reject()函数只能选择一个进行执行
5、promise的结果的改变

  1. const p = new Promise((resolve,reject) => {
  2. resolve('resolve传递参数了') //调用resolve将Promise状态改成fulfilled
  3. //resolve传递参数改变结果
  4. })

6、promise的方法

  • then方法
    - then方法传递两个参数,两个参数都是函数。当调用成功时,执行第一个函数,当调用失败时执行第二个函数 ```javascript const p = new Promise((resolve,reject) => { resolve(‘resolve传递参数了’) //调用resolve将Promise状态改成fulfilled //resolve传递参数改变结果 }) p.then(()=>{ //当promise的state是fulfilled时会被调用 console.log(‘调用成功了’) },()=>{ //当promise的state是rejected时会被调用 console.log(‘调用失败了了’) })

const p = new Promise((resolve,reject) => { // resolve(‘调用改变状态成fulfilled’) reject(‘调用改变状态成rejected’) })

console.log(p); p.then( (value) => { //传递的参数value就是fulfilled时传递的参数 console.log(‘state=fulfilled时调用’,value); },(reason) => { //传递的参数value就是rejected时传递的参数 console.log(‘state = rejected时调用’,reason); })

  1. - then的返回值<br />- then方法的返回值是一个新的promise实例<br />- 在控制台设置断点进行调试就可以看到tpending初始状态和基本信息<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/12431083/1639374365948-32595fc9-cbf3-44fe-bcc0-72b678c1233a.png#align=left&display=inline&height=705&margin=%5Bobject%20Object%5D&name=image.png&originHeight=705&originWidth=1663&size=143255&status=done&style=none&width=1663)
  2. ```javascript
  3. const t= p.then( (value) => {
  4. //传递的参数value就是fulfilled时传递的参数
  5. console.log('state=fulfilled时调用',value);
  6. },(reason) => {
  7. //传递的参数value就是rejected时传递的参数
  8. console.log('state = rejected时调用',reason);
  9. })
  10. console.dir(t)