ES6 Module与 Promise对象 本文会简要介绍 Module 命令的基本用法和 Promise 对象的三种状态。
一、Module 基本用法
ES6 在语言标准的层面上,实现了模块功能,而且实现得相当简单。ES6 模块的设计思想,是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。ES6 模块不是对象,而是通过 export 命令显式指定输出的代码,再通过 import 命令输入。
示例:
// 作为一个模块封装了用户的信息var username = "zhangsan";var password = "123123";
二、export 命令
模块功能主要由两个命令构成:export 和 import。export
命令用于规定模块的对外接口,import 命令用于输入其他模块提供的功能。
一个模块就是一个独立的文件。该文件内部的所有变量,外部无法获取。如果你希望外部能够读取模块内部的某个变量,就必须使用 export
关键字输出该变量。下面是一个 JS 文件,里面使用 export
命令输出变量。
示例,新建一个名为 userInfo.js 的文件,在其中写入以下代码。
// userInfo.jsvar username = "zhangsan";var password = "123123";exports.input_info = function () { console.log("用户名为" + username); console.log("用户密码为" + password);};
新建一个名为 showInfo.js 的文件,在其中写入以下代码。
// userInfo,jslet i = require("./userInfo");i.input_info();
在终端使用以下命令运行。
node showInfo
可以看到,如下图所示效果:
三、import 命令
使用 export
命令定义了模块的对外接口以后,其他 JS 文件就可以通过 import
命令加载这个模块。
示例:
import { username, password } from "./userInfo";
五、Promise 对象
Promise 是一种异步操作,共有三种状态:
pending(进行中)。
fulfilled(已成功)。
rejected(已失败)。
特点:
只有异步操作可以决定当前处于的状态,并且任何其他操作无法改变这个状态;
⼀旦状态改变,就不会再变。状态改变的过程只可能是从 pending 变为 fulfilled 和从 pending 变为 rejected 。如果状态发⽣上述变化后,此时状态就不会再改变 了,这时就称为 resolved(已定型) 。
六、then()
其使用格式为:
then(fn1,fn2)
fn1 , fn2 分别指定 resolved 状态和 rejected 状态的回调函数。第一个回调函数就是 fulfilled
状态时调用;第二个回调函数就是 rejected
时调用,第二个参数是可选的。
示例,新建一个名为 then.js 的文件,写入以下代码:
const promise1 = new Promise(function (resolve, reject) { resolve("success1"); resolve("success2");});const promise2 = new Promise(function (resolve, reject) { resolve("success3"); reject("reject");});promise1.then(function (value) { console.log(value); // success1});promise2.then(function (value) { console.log(value); // success3});
使用命令node then
在终端运行之后,会得到以下结果。
七、catch()
返回一个 Promise ,并且处理拒绝的情况。它的行为与调Promise.prototype.then(undefined, onRejected)
相同。
其语法为:
p.catch(onReject);p.catch(function (reason) { // 拒绝});
八、all()
其语法为:
Promise.all(iterable);
iterable
必须是一个可迭代对象,如 Array 或 String,返回一个新的 Promise
实例。
如果传入的参数中存在不是 Promise
实例,则会先调用 Promise.resolve
,将其转为 Promise
实例,再进一步处理。
如果传入的参数为空的可迭代对象,则同步返回一个已完成(already resolved)状态的 Promise;非空时则返回一个异步完成(asynchronously resolved)。
示例, 新建一个名为 all.js
的文件,写入以下代码。
// all.jsvar p1 = new Promise((resolve, reject) => { setTimeout(resolve, 1000, "one");});var p2 = new Promise((resolve, reject) => { setTimeout(resolve, 2000, "two");});var p3 = new Promise((resolve, reject) => { setTimeout(resolve, 3000, "three");});var p4 = new Promise((resolve, reject) => { reject("p4 reject!");});var p5 = new Promise((resolve, reject) => { reject("p5 reject!");});Promise.all([p1, p2, p3, p4, p5]).then( (values) => {console.log(values); }, (reason) => {console.log(reason); });// p4 reject!
在终端输入 node all.js 后,我们会看到如下图所示的结果:
九、resolve() 和 reject()
该构造函数接收两个函数作为参数,分别是 resolve 和 reject 。
当异步操作执行成功后,会将异步操作结果作为参数传入 resolve 函数并执行,此时 Promise 对象状态从 pending 变为 fulfilled ; 失败则会将异步操作的错误作为参数传入 reject 函数并执行,此时 Promise 对象状态从 pending 变为 rejected 。
const promise = new Promise((resolve, reject) => { // do something here ... if (success) {resolve(value); // fulfilled } else {reject(error); // rejected }});
总结
本文讲解了 Module 对 export 命令、import 命令的基本用法;以及对 Promise 对象三种不同状态时应进行的相应操作和示例讲解。