promise 基础

446 阅读2分钟

手写表单的JSON配置

const items = [{
    label: '姓名',
    name: 'name',
    type: 'input',
    key: 'xx',
    rule: {
        text: '错误提示',
        validate: (value) => {} // 如果需要调用异步方法,如何实现?
    }
}]

function getItem(items) {
    return item.map()
}

<Form>
    {getItem(items)}
</Form>

promise方法

image.png 会返回什么?

promise一旦新建会立即执行

  • 新建pro,新建innerpro
  • 遇到setTimeout,将setTimeout放入【宏任务】异步队列中
  • 打印2
  • 遇到resolve,innerpro的状态变更,返回3,遇到then,将innerpro放入【微任务】异步队列中
  • 遇到resolve,pro的状态变更,返回4
  • 打印pro
  • 遇到then,将pro放入【微任务】异步队列中
  • 打印end
  • 取出【微任务】异步队列中第一个,innerpro,执行then方法,打印3
  • 取出【微任务】异步队列中第二个,pro,执行then方法,打印4
  • 取出【宏任务】异步队列中的第一个,setTimeout,但此时 innerpro 状态已经变更,不再改变。

image.png

微任务包括 process.nextTick ,promise ,Object.observe ,MutationObserver      
宏任务包括 script , setTimeout ,setInterval ,setImmediate ,I/O ,UI rendering   
很多人有个误区,认为微任务快于宏任务,其实是错误的。因为宏任务中包括了 script ,浏览器会先执行一个宏任务,接下来有异步代码的话就先执行微任务。
所以正确的一次 Event loop 顺序是这样的
执行同步代码,这属于宏任务
执行栈为空,查询是否有微任务需要执行
执行所有微任务
必要的话渲染 UI
然后开始下一轮 Event loop,执行宏任务中的异步代码
通过上述的 Event loop 顺序可知,如果宏任务中的异步代码有大量的计算并且需要操作 DOM 的话,为了更快的 界面响应,我们可以把操作 DOM 放入微任务中。

promise 考点

  1. 实现一个异步请求管理方法。有200个异步请求要发送出去,但是同时最多只能发送5个请求。如何能够最快请求完全部请求。 function genFetch(index: number): Promise { ... }

function fetchAll(): void {

}