Promise 笔记

60 阅读2分钟

本文不说源码,知道规则后,看源码会容易很多。

Promise 的术语

大概了解

  1. promise 是一个有 then 方法的对象或者是函数,行为遵循本规范
  2. thenable 是一个有 then 方法的对象或者是函数
  3. valuepromise 状态成功时的值,也就是 resolve 的参数, 表示结果的数据
  4. reasonpromise 状态失败时的值, 也就是 reject 的参数, 表示拒绝的原因
  5. exception 是一个使用 throw 抛出的异常值

为什么会有微任务?

调用栈并发量大的时候,微任务可以解决异步时机不可控的问题。

微任务.png

看上图理解下面的话

1.任务队列里存放很多宏任务,都排队等着执行,有一个宏任务正在执行,I/O函数(输出功能)或者发送了网络请求,他们都给数据库执行。

2.数据库执行把函数传回到任务队列中,又得排队,但是我想要他立即执行,这时候给每个宏任务拆分一个调用栈(微任务),每执行完一个宏任务,就清空调用栈。

场景:定时器时间到,要执行前的瞬间,进入了一个宏任务,排在了定时器之前。目标:不受阻塞,直接执行某个函数。


规则

const handler = (resolve, reject) => {
    setTimeout(() => {
        resolve([3,4,5]);
        reject([1,2,3]);
    }, 1000);
}

function getSomeThing(url) {
    return new Promise(handler)
}

let promise1 = getSomeThing('/api/v1/user/role');
promise1.then((res) => {
    console.log(`the result is ${res}`);
}, (error) => {
    console.log(`the reason is ${error}`);
});

### 解析:
这里用setTimeOut 模拟异步操作
1. then 函数
- onFulfilled:
   (res) => {
     console.log('res',res)
   }
- onRejected
  (err) => {
    console.log('err',err)
  }
  
执行顺序
1.状态: pending -> 2.执行resolve(),状态: fulfilled -> 3.执行 onFulfilled
reject执行顺序就不说了,跟resolve一样

[rule--] Promise 的 status 有三种状态: 'pending','fulfilled','rejected'。

  1. 'pending' --初始状态、可以改变 一个pormise 在 'resolve/reject'前都处于这种状态 可以执行'resolve/reject'方法,让promise变成'fulfilled/rejected'状态
  2. 'fulfilled'
  • 不可变状态
  • 在'resolve'后,变成这个状态('fulfilled'),得到一个'value'
  1. 'rejected'
  • 不可变
  • 在'reject'后,变成这个状态,得到一个'reason'

then 函数:

  1. 参数 'onfulfilled' 必须是函数,如果不是就忽略 'onRejected' 必须是函数,如果不是就忽略
  2. onFulfilled/onRejected 的特效 在primise 变成'fulfilled/rejected' 状态的时候,应该调用'onFulfilled/onRejected' 在promise 变成 'fulfilled/rejected'状态之前,不应该被调用. 只能被调用一次 [--rule]

resolvePromise

有机会再更吧