zoukankan      html  css  js  c++  java
  • 关于promise为什么要使用微任务

    首先我们先简略的写一个promise的内部执行的大致原理

    function Bromise(executor) {
      // 成功队列
      var resolveQueue = []
      // 失败队列
      var rejectQueue = []
      this.then = function(onResolve) {
        resolveQueue.push(onResolve)
      }
      this.catch = function(onReject) {
        rejectQueue.push(onReject)
      }
      function resolve(value) {
        console.log(resolveQueue.length)
        // 循环执行成功队列里面的回调函数
        while(true) {
          let resolve = resolveQueue.shift()
          if(resolve) {
            // 直接执行不使用微任务时
            resolve(value)
            return true
          } else {
            return false
          }
        }
      }
      function reject(value) {
        while(true) {
          let reject = rejectQueue.shift()
          if(reject) {
            reject(value)
            return true
          } else {
            return false
          }
        }
      }
      executor(resolve, reject)
    }
    let promise = new Bromise((resolve, reject) => {
      resolve(100)
    })
    promise.then((value) => {
      console.log(value)
    })

    此时打印出来的console.log(resolveQueue.length)结果为0

    因此不使用微任务直接执行的话会导致resolve(100)在执行的时候.then还未执行导致成功队列没有执行.push所以成功队列长度为0


    function Bromise(executor) {
      // 成功队列
      var resolveQueue = []
      // 失败队列
      var rejectQueue = []
      this.then = function(onResolve) {
        resolveQueue.push(onResolve)
      }
      this.catch = function(onReject) {
        rejectQueue.push(onReject)
      }
      function resolve(value) {
        setTimeout(() => {
          // 使用setTimeout模仿微任务执行顺序
          console.log(resolveQueue.length)
          // 循环执行成功队列里面的回调函数
          while(true) {
            let resolve = resolveQueue.shift()
            if(resolve) {
              resolve(value)
              return true
            } else {
              return false
            }
          }
        }, 0)
      }
      function reject(value) {
        while(true) {
          let reject = rejectQueue.shift()
          if(reject) {
            reject(value)
            return true
          } else {
            return false
          }
        }
      }
      executor(resolve, reject)
    }
    let promise = new Bromise((resolve, reject) => {
      resolve(100)
    })
    promise.then((value) => {
      console.log(value)
    })

    此时打印的length为1

    所以promise之所以要使用微任务是由Promise回调函数延迟绑定技术导致的

  • 相关阅读:
    数组实战---集合了一些常用函数
    PHP正则表达式函数
    ThinkPHP学习之-------视图
    ThinkPHP小技巧之改变应用名称
    ThinkPHP中常用总结一CURD操作
    PHPExcel从数据库导出数据
    用PHP脚本来拆分字符串并形成两个新字段
    PHPExcel导出数据的基本使用方法
    php 中文切割字符串长度
    Nginx 在configure时的参数
  • 原文地址:https://www.cnblogs.com/wangxirui/p/11898910.html
Copyright © 2011-2022 走看看