day8(es6异步编程) | 青训营笔记

27 阅读3分钟

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' }