(1)、Async/await的基本使用
这是ES7的语法,它是基于generator函数做的语法糖。async用于申明一个function是异步的,返回一个promise对象,而await可以认为是async wait的简写,等待一个异步方法执行完成。async必须声明的是一个function,await必须在声明的函数内部使用。
<script>
// async 用于申明一个function是异步的,返回一个promise对象
async function demo() {
setTimeout(() => {
console.log('我是async声明的异步函数');
},1000);
return '我是异步函数的返回值';
}
demo();
console.log(demo());
demo().then(res => {
console.log(res);
})
// await 可以async wait 的简写,必须出现再async的函数内部,不能单独使用
// await 等待的虽然是promise对象,但不用通过then获取返回值,而是直接得到返回值
async function demo2() {
let result = await Promise.resolve(123);
console.log(result);
}
demo2();
</script>
(2)、Async/await的应用
Promise虽然一方面解决了callback的回调地狱,但是相对的把回调“纵向发展”了,形成了一个回调链。例如:
<script>
function sleep(wait) {
return new Promise((res,rej) => {
setTimeout(() => {
res(wait);
},wait);
});
}
sleep(100).then(result => {
return sleep(result + 100);
}).then(result02 => {
return sleep(result02 + 100);
}).then(result03 => {
console.log(result03);
})
</script>
应用:可以看出后面的结果都是依赖前面的结果,await是强制把异步变成了同步,这一句代码执行完,才会执行下一句
async function demo() {
let result01 = await sleep(100);
// 上一个await执行完才会执行下个
let result02 = await sleep(result01 + 100);
let result03 = await sleep(result02 + 100);
return result03;
}
demo().then(result => {
console.log(result);
})
Module模块
(1)、模块Module
模块Module:一个模块,就是一个对其他模块暴露自己的属性或者方法的文件。
在这里,我们会把module-A.js和module-B.js分别当作两个模块(moduleA模块和moduleB模块)来对待和处理。用这两个模块来演示如何暴露一个模块的属性或方法。
(2)、导出Export
导出Export:作为一个模块,它可以选择性地给其他模块暴露(提供)自己的属性和方法,供其他模块使用。
(3)、导入Import
导入Import:作为一个模块,可以根据需要,引入其他模块的提供的属性或者方法,供自己模块使用。
(4)、模块化的实现
带着这三个概念,我们来演示一下它们的基本用法:
moduleB模块代码:
exprot var name = '前端君';
模块B我们使用关键字export关键字,对外暴露了一个属性:name的值为:字符串“前端君”。一个关键字,一句代码就实现了,是不是很简单。
模块B演示了导出,接下来我们用模块A来演示如何导入。
moduleA模块代码:
import {name} from './module-B.js';
console.log(name);
模块A我们使用关键字import导入了模块B的name属性,并且赋值给变量name。关键字from的作用是指定你想要引入的模块,我们这里指定的是module-B.js文件,也就是上面的模块B。打印结果:“前端君”正是模块B的对外暴露的属性。
(5)、批量导出
对于模块B,如果你想导出(暴露)多个属性和方法的话
var name = '前端君';
var age = 23;
var say = function () {
console.log('say hello');
}
export {name,age,say};
上面,我们定义了2个属性和1个方法,最后用一个对象实现将它们批量导出。我们更推荐的是使用这种方法实现导出,因为当对外暴露的属性和方法较多的时候,这种方法可以更直观地看出当前模块暴露了哪些变量。
import {name,age,say} from './module-B.js';
console.log(name);
console.log(age);
say();
(6)、重命名导出的变量
import {name as newname} from './module-B.js';
console.log(newname);
(7)、整体导入
import * as obj from './module-B.js';
console.log(obj.name);
console.log(obj.age);
obj.say();