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.js
var username = "zhangsan";
var password = "123123";

exports.input_info = function () {
    
    
  console.log("用户名为" + username);
  console.log("用户密码为" + password);
};

新建一个名为 showInfo.js 的文件,在其中写入以下代码。

// userInfo,js
let i = require("./userInfo");
i.input_info();

在终端使用以下命令运行。

node showInfo

可以看到,如下图所示效果:
请添加图片描述

扫描二维码关注公众号,回复: 14209517 查看本文章

三、import 命令

使用 export 命令定义了模块的对外接口以后,其他 JS 文件就可以通过 import 命令加载这个模块。

示例:

import {
    
     username, password } from "./userInfo";

五、Promise 对象

Promise 是一种异步操作,共有三种状态:

  • pending(进行中)。
  • fulfilled(已成功)。
  • rejected(已失败)。

特点:

  1. 只有异步操作可以决定当前处于的状态,并且任何其他操作无法改变这个状态;
  2. ⼀旦状态改变,就不会再变。状态改变的过程只可能是从 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.js
var 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 对象三种不同状态时应进行的相应操作和示例讲解。

猜你喜欢

转载自blog.csdn.net/weixin_44009656/article/details/125039023
今日推荐