promise 规范及应用

183 阅读4分钟

课程目标

  • 了解计算机原理中进程/线程概念和区别以及浏览器原理
  • Promise作用及常用方法
  • Promise规范及手写简单Promise

知识要点

  • 计算机中进程表示CPU资源分配的最小单位;线程表示CPU调度的最小单位

  • 浏览器包括的线程有:

  1. GUI渲染引擎: a.解析HTML、CSS,构建DOM树 => 布局 =>绘制 b.与JS引擎互斥,当执行JS引擎线程时,GUI会pending,当任务队列空闲时,才会继续执行GUI

  2. JS引擎线程 a.处理JS,解析执行脚本 b.分配、处理、执行待执行的事件,构建event队列 c.阻塞GUI渲染

3.定时器触发引擎 a.异步定时器处理与执行--setTimeout/setInterval b.接受JS引擎分配的定时器任务,并计数 c.处理完成后交与事件触发线程触发

4.异步HTTP请求线程 a.异步执行请求类处理--Promise/Ajax等 b.接受JS引擎分配异步HTTP请求 c.监听回调,交给事件触发线程触发

5.事件触发引擎 a.接受来源--定时器、异步、用户操作 b.将回调过来的事件依次接入到任务队列队尾,还给JS引擎

  • Promise简述:
  1. 解决异步请求和延迟时回调导致的无穷嵌套(回调地狱)
  2. 对多个异步事件执行通过链式调用
  3. 等异步事件全部执行完再操作 -- Promise.all([]).then(res=>{})
  4. 一旦有执行完成的立即操作 -- Promise.race([]).then(res=>{})
  • Promise框架规范
  1. promise的三种状态:pending(默认状态)、fulfilled(成功状态)、rejected(失败状态)
  2. new Promise执行器executor(),执行参数是reslove,reject
  3. promise只能从默认状态向成功或失败状态流转
  4. promise中value表示保存成功状态的枚举值--undefined/thenable/promise
  5. promise中失败状态值--reason
  6. promise中一定会有then,接收来源为成功状态或失败状态的回调--onFulfilled(value)/onRejected(reason)
  • 手写一个简单的Promise
const PENDING = 'PENDING'
const FULFILLED = 'FULFILLED'
const REJECTED = 'REJECTED'
class Promis{ //类
    constructor(executor){ //构造
        // 默认状态的处理:PENDING
        this.status = PENDING
        // 成功状态值
        this.value = undfined
        this.reason = undfined
        this.onResolvedCallbacks = []
        this.onRejectedCallbacks = []
        let resolve = value =>{
            if(this.status === PENDING){
                this.status = FULFILLED
                this.value = value
                (this.onResolvedCallbacks || []).forEach(fn => fn())
            }
        }
        
        let reject = reason =>{
            if(this.status === PENDING){
                this.status === REJECTED
                this.reason = reason
                (this.onRejectedCallbacks || []).forEach(fn => fn())
            }
        }
        
        try{
            executor(resolve,reject)
        }catch(error){
            reject(error)
        }
    }
    
    then(onFuilled,onRejected){
        if(this.status === FULFILLED){
            onFuilled(this.value)
        }
        if(this.status === REJECTED){
            onRejected(this.reason)
        }
        if(this.status === PENDING){
            this.onResolvedCallbacks.push(() =>{
                onFuilled(this.value)
            })
            this.onRejectedCallbacks.push(() =>{
                onRejected(this.reason)
            })
        }
    }   
}

拓展

生成器 Generator

1:生成器是一种返回迭代器的函数,通过function关键字后的星号(*)来表示,函数中会用到新的关键字yield。星号可以紧挨着function关键字,也可以在中间添加一个空格

function* generator() {
    const list = [1, 2, 3];
    for (let i of list) {
        yield i;
    }
}


let g = generator();

console.log(g.next()); // {value: 1, done: false}
console.log(g.next()); // {value: 2, done: false}
console.log(g.next()); // {value: 3, done: false}
console.log(g.next()); // {value: undefined, done: true}

2:特性

  1. 每当执行完一条yield语句后函数就会自动停止执行, 直到再次调用next();
  2. yield关键字只可在生成器内部使用,在其他地方使用会导致程序抛出错误;
  3. 可以通过函数表达式来创建生成器, 但是不能使用箭头函数

迭代器 Iterator

迭代器Iterator 是 ES6 引入的一种新的遍历机制,同时也是一种特殊对象,它具有一些专门为迭代过程设计的专有接口。 每个迭代器对象都有一个next()方法,每次调用都返回一个当前结果对象。当前结果对象中有两个属性:

  1. value:当前属性的值
  2. done:用于判断是否遍历结束,当没有更多可返回的数据时,返回true 每调用一次next()方法,都会返回下一个可用的值,直到遍历结束

Async 和 Await

async函数是使用async关键字声明的函数。 async函数是AsyncFunction构造函数的实例, 并且其中允许使用await关键字。asyncawait关键字让我们可以用一种更简洁的方式写出基于Promise的异步行为,而无需刻意地链式调用promise

await  操作符用于等待一个Promise 对象。它只能在异步函数 async function 中使用