• 一、async
    1.ES2017标准引入了async函数,是的异步操作变得更加方便。
    2.async是Generator函数的语法糖
const asyncReadFile = async function(){
	const f1 = await readFile('/etc/fstab');
	const f2 = await readFile('/etc/shells');
	console.log(f1.toString());
	console.log(f2.toString());
};
// await类似于generator中的yield,await一般都是一个异步操作,在现实中,后面会加异步操作; 回调地域:f2的异步操作需要f1异步操作的结果

练习1

 <script>
        function beiliao() {
            //logic
            return new Promise(function (resolve, reject) {
                console.log("开始备货,大约3秒中后完成:");
                //3秒(3000毫秒)之后,执行resolve函数,第三个参数"mima"是resolve的参数哦!
                setTimeout(resolve, 3000, "mima");
            });
        }

        function quhuo(pwd) {

            //logic
            return new Promise(function (resolve, reject) {
                if (pwd != "mima") {
                    //如果密码不正确,直接调用reject函数,表示失败
                    reject("pwd is wrong!!!!!")
                } else {
                    console.log("开始出发取货,大约2秒后完成:");
                    setTimeout(resolve, 2000, "xxxxxxx");
                }
            });

        }

        function huomian(p) {
            return new Promise(function (resolve, reject) {

                console.log("开始和面,大约2.5秒后完成:");
                setTimeout(resolve, 2500, "xxxxxxx");

            });
        }


        function huoxian(p) {
            return new Promise(function (resolve, reject) {

                console.log("开始和馅,大约2秒后完成:");
                setTimeout(resolve, 2000, "xxxxxxx");

            });
        }

        function baojiaozi() {
            return new Promise(function (resolve, reject) {

                console.log("开始包饺子,大约2.5秒后完成:");
                setTimeout(resolve, 2500, "60");

            });
        }



        // 用async来解决异步问题,模拟一个dumpling包饺子的过程
        async function dp() {
            // 在async这种解决异步的方法里,我们用await来提交;
            //在async中可以写很多的函数,不是只能写await
            try { //抓取错误一般都是写在async中
                var pwd = await beiliao(); //备料
                console.log("备货已完成,货物的提取码为:" + pwd); //这里的pwd可以被下一个地域调用,一般会返回另一个异步操作!!!!
                var p = await quhuo(pwd); //取货的参数是上一个异步操作的返回值,这样这个异步操作就可以获得上一个异步操作的返回值。
                console.log("已取货完成,可以开始下一步流程和面了");
                // ********************这里是一个复杂的异步操作哟!注意一下!!!!!!**********************************
                // 和面和和馅可以同时进行,都完成才进行下一步包饺子
                await Promise.all([huomian(), huoxian()]);
                // 这个Promise返回的是一个数组
                console.log("和面、和馅完成。")

                var n = await baojiaozi(); //包饺子
                console.log("包饺子完成,一共包了:" + n + "个");
                return "chi!"; //吃    包好了饺子,可以开始吃了
            } catch (error) {
                console.log(error);
            }
        }
        //对于async来说,直接调用即可,then()中是运行成功或失败后的操作
        dp().then(data => {
            console.log(data) //这里会输出返回的结果 chi!
        });
    </script>

袁磊老师的课,ES6(六)

  • 二、模块化
    1.CommonJS,AMD,CMD 都是js模块化的规范。
    2.CommonJS是服务器端js模块化的规范,NodeJS是这种规范的实现。
    3.AMD(异步模块定义)和CMD(通用模块定义)都是浏览器端js模块化的规范
    RequireJS遵循的是AMD,SeaJS遵循的是CMD。

  • ①CommondJS
    CommondJS加载模块是同步的,所有只有加载完成才能执行后面的操作。像Node.js主要用于服务器的编程,加载的模块文件一般都已经存在于本地硬盘,所以加载起来较快,不用考虑异步加载的方式,所以CommonJS规范比较适用。但如果是浏览器环境,要从服务器加载模块,这时就必须采取异步模式。所以就有了AMD CMD解决方案。

//代码示例
var module = require("./module");
//可以引入异步的文件
module()
module.test();
  • ②AMD
    Asynchroous Module Definiition 规范其实只有一个主要接口define(id?, dependencies?, factory),它主要在声明模块的时候指定多有的依赖dependencies,并且还要当做形参传到factory中,对于依赖的模块提前执行,依赖前置,就是前面的模块必须执行完。
    严格的按照顺序来
    不管用不用的到,我都给你加载出来

    RequireJS实现了这种规范。
  • ③CMD
    Common Module Definition 规范和AMD很相似,尽量保持简单,并与CommonJS和Node.js的Modules规范保持了很大的兼容性
    优点:依赖就近,延迟执行,可以很容易在Node.js中运行
    缺点:依赖 打包,莫魁岸的加载逻辑偏重。
    什么时候用,什么时候加载
  • 三、export命令
    模块功能主要由两个命令构成,export和import。export命令用于规定模块的对外接口,import命令用于输入其他模块提供的功能。

要点!!!!!!
①每一个模块只加载一次, 每一个JS只执行一次, 如果下次再去加载同目录下同文件,直接从内存中读取。 一个模块就是一个单例,或者说就是一个对象;

②每一个模块内声明的变量都是局部变量, 不会污染全局作用域;

③模块内部的变量或者函数可以通过export导出;

④一个模块可以导入别的模块
⑤在一个文件或模块中,export、import可以有多个,export default仅有一个
⑥通过export方式导出,在导入时要加{ },export default则不需要

练习2
这个练习有好几个文件
第一个:(先写好) 0411random.js

// 通过export向外暴露接口
export function rani(){
    return Math.floor(Math.random()*101);
    // 生成0到100的随机数
}
export function now(){
    // 在一个模块中,可以暴露多个接口
    return new Date().toString();
    // 返回一个当前的日期
}
// 这个接口可以是变量、函数、对象等

第二个:(先写好) 0411export_str.js

var str="yuan";
var name = "lei";
// 如何把一个变量传出去?
// 只输出变量的时候,我们需要加一个大括号,如果同时输出变量和函数的时候,可以不加大括号
export {str,name as mingzi};
// name as mingzi 的意思就是你看见的代码里是name,而被引用后它叫做mingzi,其他人看见的是mingzi

第三个:(先写好) 0411export_default.js

var xxxx ="default value!!!!";
export default xxxx;
// 我输出的是一个变量,用户并不需要知道我的变量名叫做什么
// 一个模块只能有一个 export default,

第四个:(先写好,import) 0411import.js

// 如何调用random那个模块,就用import即可
// 一般的import都有大括号跟着
import {
    rani,
    now
} from `./0411random.js`;
import {
    str as xing,
    mingzi
} from `./0411export_str.js`;
// 下面的import的是一个default,变量的名字suibian是随便起的,只有import default的时候不需要用大括号
import suibian from `.0411export_default.js`;

// 引入了这个模块后,我们就拥有了rani方法
console.log("随机数:", rani());
console.log("当前时间:", now());
// console.log(str);
// str也可以用as变为其他名字
console.log(xing);
console.log(mingzi);
console.log(suibian);

第五个:(展示的页面) 0411show_export&import.js

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>import随机数演示</title>
</head>

<body>
    <!-- 因为没有其他办法,现阶段只能用网页的方式来演示export和import -->

    <script type="module" src="import.js"></script>
    <!-- 对于module,我们只能用localhost和www下来看,浏览器,我们只能用firefox来看 -->
</body>

</html>

总体效果:
袁磊老师的课,ES6(六)
一些注释和知识点,都放在代码中啦~
今天的笔记就这样啦,贝贝~

相关文章:

  • 2021-09-05
  • 2021-06-13
  • 2022-02-25
  • 2022-12-23
  • 2021-07-14
  • 2021-06-11
  • 2022-01-04
  • 2021-06-24
猜你喜欢
  • 2021-09-11
  • 2021-10-12
  • 2022-01-07
  • 2021-05-08
  • 2021-06-15
  • 2021-09-26
  • 2021-11-22
相关资源
相似解决方案