Generator
generator是异步任务的容器(交出函数的执行权(即暂停执行)),需要用.next()方法启动。可以分阶段运行。
yield命令是异步不同阶段的分界线,定义不同的状态
每次调用一个函数执行一次yield :返回一个对象(value 和done 俩个参数)value表示yield或者return里面的值,done(Boolean)表示函数是否执行完
yield可以用来加强控制(懒汉式加载 调用函数指针和调用生成器是两码事)
- 函数yield外部的变量或者输出在后面用迭代器.next()调用,第一次调用会开辟空间,将这些数据放在内存中,在迭代器没有结束前都不会释放空间;
- generator迭代器.next()方法可以传递参数;参数可以覆盖前面yield返回的值
- 不过给第一个 next启动器传递值没有意义:因为next刚启动时候前面没有yield返回的值可以覆盖,给第一个next传递参数没有
function* fn() {
var _n = 12;
var _v = yield _n + 12; // _v -> yield命令返回值通过后续的next参数决定(没有则为undefined)
console.log('第二个next后执行')
yield _v;
}
var a = fn();
console.log(a.next()); //{value: 24, done: false}
console.log(a.next()); //第二个next后执行 {value: undefined, done: false}
var b = fn();
console.log(b.next()); //{value: 24, done: false}
console.log(b.next('abc')); //第二个next后执行 {value: 'abc', done: false}
promise
Promise(承诺) 是异步编程的一种解决方案,在没有Promise的时候,异步编程是通过回调函数来解决的,将函数作为参数用来获取异步操作得到的数据,但是嵌套多层callback函数的时候就会造成回调地狱,使代码可读性和可维护性降低。
Promise有三种状态,分别是pending(等待),fulfilled(成功)和rejected(失败)
当我们new
一个promise
,此时我们需要传递一个回调函数,这个函数为立即执行的,称之为(executor)
这个回调函数,我们需要传入两个参数回调函数,reslove
,reject
(函数可以进行传参)
- 当执行了
reslove
函数,会回调promise对象的.then函数 - 当执行了
reject
函数,会回调promise对象的.catch函数
then、catch方法的作用是为Promise对象添加状态改变时的回调函数(放入微队列中等待执行),因为这些方法返回的也是Promise实例,所以可以链式调用
const promise = new Promise((resolve, reject) => {
console.log('1')
resolve('3')
})
const promise2 = promise.then(res => {
console.log(res)
return new Promise((resolve, reject) => resolve('4'))
})
console.log('2')
console.log(promise2)
console.log(promise2.then(res => console.log(res)))
// 1
// 2
// Promise { <pending> }
// Promise { <pending> }
// 3
// 4
async/await
async 函数(async 是“异步”的简写,而 await 可以认为是 async wait 的简写)是使用async
关键字声明的函数。async 函数是 AsyncFunction
构造函数的实例,
async声明的函数返回的是一个promise实例。
await如果等待的是一个promise函数,则会阻塞后续的代码,等promise状态改变后执行。
// await 的使用需要在async函数内部
async function fn() { // [AsyncFunction: fn]
return '123'
}
console.log(fn()) // Promise{ '123' }