Node.js中ES6模块化及Promise对象

目录
  • ES6模块化
    • CommonJS 规范
    • 模块化开发好处
    • 模块化规范划分
    • ES6模块化开发注意点
    • ES6 导入导出
  • Promise对象
    • 使用语法
    • Promise中的同步异步
    • Promise 封装
    • 第三方then-fs解决回调地狱

ES6模块化

CommonJS 规范

node.js 遵循了 CommonJS 的模块化规范。其中:

  • 导入其它模块使用 require()方法
  • 模块对外共享成员使用 module.exports 对象

模块化开发好处

模块化开发的好处有很多,其中:

  • 实现了在JS文件中引用其他文件
  • 避免命名冲突的问题
  • 大家都遵守同样的模块化规范写代码,降低了沟通的成本,极大方便了各个模块之间的相互调用
  • 只需关心当前模块本身的功能开发,需要其他模块的支持时,在模块内调用目标模块即可

模块化规范划分

在 ES6 模块化规范诞生之前,JavaScript 社区已经尝试并提出了 AMD 、 CMD 、 CommonJS 等模块化规范。 但是,这些由社区提出的模块化标准,还是存在一定的差异性与局限性、并不是浏览器与服务器通用的模块化标准

  • AMD 和 CMD 适用于浏览器端的 Javascript 模块化
  • CommonJS 适用于服务器端的 Javascript

模块化太多的模块化规范给开发者增加了学习的难度与开发的成本。因此,官方的 ES6 模块化规范诞生了!

ES6模块化开发注意点

node.js 中默认仅支持 CommonJS 模块化规范,若想基于 node.js 体验与学习 ES6 的模块化语法,需要按照如下两个步骤进行配置:

  • 确保安装了 v13.0.0 或更高版本的 node.js
  • 在 package.json 的根节点中添加 "type": "module" 节点
  • 配置之后,则只能使用ES6模块化语法,不能再使用CommonJS语法了

ES6 导入导出

主模块:

// //导入子模块
// //方法1.默认导入  不能解构接收
// import obj from './02-子模块.js'
// console.log(obj);
// //不能再接收位置直接解构
//import { fn, num } from './02-子模块.js'
//方法2.按需导入
// import { str, fn2 } from './02-子模块.js'
// console.log(str);
// fn2
//import bbb from './02-子模块.js'
//方法3.只导入 不接收 使用的是功能
import './02-子模块.js'
//es6也有缓存机制

子模块:

//导出内容
//方法1.默认导出一次  不允许导出多次
// const num = 123
// function fn() {
//   console.log('我是函数fn');
// }
// export default { fn, num }

//方法2.按需导出  可以导出多次
//必须定义的时候就导出
// export const str = 'abc'
// export function fn2() {
//   console.log('我是函数fn2');
// }

//方法3.不导出任何数据  让别人使用自己的功能
for (let i = 0; i < 3; i++) {
  console.log('重要的事情说三遍!');
}

Promise对象

异步操作是 JavaScript 编程的麻烦事,麻烦到一直有人提出各种各样的方案,试图解决这个问题。早期使用回调函数处理异步编码,但存在回调地狱的问题。ES6中,新增了Promise 对象,从此异步编程摆脱了回调函数的束缚。

使用语法

let p = new Promise((resolve, reject) => {
    // ... some code
    if (/* 异步操作成功 */) {
        resolve(value);
    } else {
        reject(error);
    }
});

注意点:

  • new Promise()
  • 必须传入一个函数作为Promise的参数,这个函数在 new Promise的时候就会执行
  • 函数有 resolve 和 reject 两个形参
  • 函数就相当于一个容器,可以将异步任务放到这里
  • 将异步任务成功的结果传给 resolve 函数;将失败的信息传给 reject 函数
p.then(
    result => { /* 获取成功的结果 */ }
);
// 或者
p.then(
    result => { /* 获取成功的结果 */ },
    err => { /* 获取失败的结果 */ }
);
// 或者
p.then(
    result => { /* 获取成功的结果 */ }
).catch(
    err => { /* 获取失败的结果 */ }
);

注意点:

  • then方法接收以个函数类型的参数,只处理成功
  • then方法接收两个函数类型的参数,分别用于接收 resolve 的值 和 reject 的值
  • then方法也可以只接收一个参数,表示只接收 resolve 的值,失败的结果可以通过链式调用catch方法捕获

Promise中的同步异步

new Promise 和 new 其他对象一样,是同步任务。

获取结果时(调用 resolve 触发 then方法时)是异步的。

Promise 封装

// 封装
function myReadFile(filename) {
    return new Promise((resolve, reject) => {
        fs.readFile(filename, 'utf-8', (err, data) => {
            err ? reject(err) : resolve(data.length);
        })
    });
}
// 调用
myReadFile('./files/a.txt')
    .then(a => {
        console.log(a);
        return myReadFile('./files/b.txt');
    })
    .then(b => {
        console.log(b);
        return myReadFile('./files/c.txt');
    })
    .then(c => {
        console.log(c)
    })

第三方then-fs解决回调地狱

// npm  i  then-fs
const fs = require('then-fs');
fs.readFile('./files/a.txt', 'utf-8')
    .then(res1 => {
        console.log(res1);
        return fs.readFile('./files/b.txt', 'utf-8')
    })
    .then(res2 => {
        console.log(res2);
        return fs.readFile('./files/b.txt', 'utf-8')
    })
    .then(res3 => {
        console.log(res3)
    })

注意:未来很多模块支持Promise对象开发,就是返回的是一个Promise对象; 如 axios

到此这篇关于Node.js中ES6模块化及Promise对象的文章就介绍到这了,更多相关Node.js ES6模块 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Node.js+ES6+dropload.js实现移动端下拉加载实例

    最近要涉及微信移动端项目,所以尝试学习一些移动端的实用技能,这个demo服务由Node搭建服务.下拉加载使用插件dropload,数据渲染应用了ES6中的模板字符串.有兴趣的小伙伴可以自己尝试下. 1.Node+express -- 服务搭建 由于该demo是在服务器端实现,所以需要通过npm包引入express模块,用来搭建简易服务. 1.官网下载node,npm包管理工具会同时自动下载. 2.命令行输入:npm install express -g //安装express模块 3.在项目中新

  • node.js的exports、module.exports与ES6的export、export default深入详解

    前言 最近难得有空,决定开始重新规范的学习一下node编程.但是引入模块我看到用 require的方式,再联想到咱们的ES6各种export .export default. 阿西吧,头都大了.... 头大完了,那我们坐下先理理他们的使用范围. require: node 和 es6 都支持的引入 export / import : 只有es6 支持的导出引入 module.exports / exports: 只有 node 支持的导出 这一刻起,我觉得是时候要把它们之间的关系都给捋清楚了,不

  • 详解Node.js如何处理ES6模块

    一.两种模块的差异 ES6 模块和 CommonJS 模块有很大的差异. 语法上面,CommonJS 模块使用require()加载和module.exports输出,ES6 模块使用import和export. 用法上面,require()是同步加载,后面的代码必须等待这个命令执行完,才会执行.import命令则是异步加载,或者更准确地说,ES6 模块有一个独立的静态解析阶段,依赖关系的分析是在那个阶段完成的,最底层的模块第一个执行. 二.Node.js 的区分 Node.js 要求 ES6

  • node.js Promise对象的使用方法实例分析

    本文实例讲述了node.js Promise对象的使用方法.分享给大家供大家参考,具体如下: Promise对象是干嘛用的? 将异步操作以同步操作的流程表达出来 一.Promise对象的定义 let flag = true; const hello = new Promise(function (resolve, reject) { if (false) {//异步操作成功 resolve("success"); } else { reject("error");

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

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

  • node.js中使用q.js实现api的promise化

    关于啥是promise以及promise解决的是啥问题,敬请体验node的回调异步编码大法,顺带移步http://wiki.commonjs.org/wiki/Promises/A 看看是咋定义的,在此不再赘述. 这里我们看看怎么用q.js 实现node api的promise. 一.万事开始皆为install 复制代码 代码如下: npm install q 二.标准node style api 的promise化方法 1.使用Q.nfcall 相对于Q.fcall ,Q.nfcall 就是n

  • Node.js中ES6模块化及Promise对象

    目录 ES6模块化 CommonJS 规范 模块化开发好处 模块化规范划分 ES6模块化开发注意点 ES6 导入导出 Promise对象 使用语法 Promise中的同步异步 Promise 封装 第三方then-fs解决回调地狱 ES6模块化 CommonJS 规范 node.js 遵循了 CommonJS 的模块化规范.其中: 导入其它模块使用 require()方法 模块对外共享成员使用 module.exports 对象 模块化开发好处 模块化开发的好处有很多,其中: 实现了在JS文件中

  • Node.js中的模块化,npm包管理器详解

    目录 模块化的基本概念 什么是模块化 模块化拆分的好处 Node.js中的模块化 Node.js中模块的分类 加载模块 模块作用域 向外共享模块作用域中的成员 module对象 exports对象 npm与包 包 如何下载包 在项目中安装包的命令 解决下包速度慢的问题 为什么下包速度慢 解决方法一--淘宝NPM镜像服务器 解决方法二--切换npm的下包镜像源 解决方法三--nrm 总结 模块化的基本概念 什么是模块化 模块化是指解决一个复杂问题时,自顶向下逐层把系统划分成若干模块的过程.对于整个

  • node.js中的模块化标准CommonJS与自定义模块

    一. 什么是 CommonJs? JavaScript 是一个强大面向对象语言,它有很多快速高效的解释器. 然而, JavaScript标准定义的 API 是为了构建基于浏览器的应用程序.并没有制定一个用于更广泛的应用程序的标准库. CommonJS 规范的提出,主要是为了弥补当前 JavaScript 没有标准的缺陷. 它的终极目标就是: 提供一个类似 Python, Ruby 和 Java 语言的标准库,而不只是停留在小脚本程序的阶段.用 CommonJS API 编写出的应用, 不仅可以利

  • 详解Node.js中的模块化方法

    目录 一.模块化的基本概念 1.什么是模块化 2.模块化规范 二.Node.js 中的模块化 1.Node.js 中的模块化分类 2.加载模块 3.向外共享模块作用域中的成员 4.Node.js 中的模块化规范 (1)什么是CommonJS模块规范 (2)CommonJS 模块化规范 (3)每个导出的模块都有一个moudle对象,该对象包含的属性有: 三.npm 与 包 1.包的概念 2.包的安装与卸载 3.包管理配置文件 总结 一.模块化的基本概念 1.什么是模块化 模块化是指解决一个复杂问题

  • 使用node.js中的Buffer类处理二进制数据的方法

    前言 在Node.js中,定义了一个Buffer类,该类用来创建一个专门存放二进制数据的缓存区.这篇文章就详细介绍了node.js中的Buffer类处理二进制数据的方法,下面话不多说,来看看详细的介绍. 创建Buffer对象 第一种:直接使用一个数组来初始化缓存区 var arr = [0,1,2] var buf = new Buffer(arr) console.log(buf) 执行效果: 第二种:直接使用一个字符串来初始化缓存区 var str = 'hello' var buf = n

  • Node.js中如何合并两个复杂对象详解

    前言 相信大家都知道在通常情况下,在Node.js中我们可以通过underscore的extend或者lodash的merge来合并两个对象,但是对于像下面这种复杂的对象,要如何来应对呢?下面来一起学习学习吧. Node.js合并两个复杂对象 例如我有以下两个object: var obj1 = { "name" : "myname", "status" : 0, "profile": { "sex":&q

  • Node.js中的Buffer对象及创建方式

    目录 什么是Buffer? 注意 Buffer中存储的都是二进制数据,但是在显示时以16进制显示 Buffer.length表示占用内存的大小 Buffer打印数字时会以十进制方式显示 Buffer的创建方法 通过Buffer的构造函数,但不推荐使用 通过allocUnsafe方法 通过alloc方法 通过Buffer.from()方法 写入缓冲区 从缓冲区读取数据 将 Buffer 转换为 JSON 对象 拷贝缓冲区 缓冲区与迭代器 总结 什么是Buffer? js语言自身只有字符串数据类型,

  • import与export在node.js中的使用详解

    简述 import与export是es6中模块化的导入与导出,node.js现阶段不支持,需要通过babel进行编译,使其变成node.js的模块化代码.(关于node.js模块,可参考其他node.js模块化的文章) export 曝露 使用export可以曝露出方法.对象.字符串等等,如下代码 //写法1 export var foo=function(){ console.log(1); } //写法2 var bar ={a:"1",b:2}; export {bar}; //

  • Node.js中的异步生成器与异步迭代详解

    前言 生成器函数在 JavaScript 中的出现早于引入 async/await,这意味着在创建异步生成器(始终返回 Promise 且可以 await 的生成器)的同时,还引入了许多需要注意的事项. 今天,我们将研究异步生成器及其近亲--异步迭代. 注意:尽管这些概念应该适用于所有遵循现代规范的 javascript,但本文中的所有代码都是针对 Node.js 10.12 和 14 版开发和测试的. 异步生成器函数 看一下这个小程序: // File: main.js const creat

随机推荐