js补充6

异步

promise.all then和catch出来都是解决状态的

promise.allSettled 拿到的是所有状态的

promise.race()

  • 里面是promise对象数组,哪有promise请求成功快就用哪个

promise队列原理,就是在then里面再new 一个promise然后只有设置resolve的时候,后面的then才可以用

  function query(num) {
     
      let promise =  Promise.resolve('你好')
      console.log(promise);
      num.map(v => {
     
        promise = promise.then((e) => {
     
          console.log(e);
          return new Promise(resolve => {
     
            setTimeout(() => {
     
              console.log(v);
              resolve('好呀')   // 只有加了resolve()  后面生成的promise.then才
            }, 1000)
          })
        })
      })
    }
    query([1, 2, 3, 4, 5])

在类中使用aysnc/awit

    class User {
     
      constructor(name) {
     
        this.name = name
      }
      // 在类中定义一个then方法,这个类也就相当于promise
      then(resolve, reject) {
     
        setTimeout(() => {
     
          resolve(this.name)
        }, 2000)
      }
    }
    async function get() {
     
      let user = await new User('你是大傻逼')
      console.log(user);
    }
    get()

async函数里面不加awit 的时候,函数是并行的,同时开始执行,下面是实现并行的两种方式

 class User {
     
      constructor(name) {
     
        this.name = name
      }
      // 在类中定义一个then方法,这个类也就相当于promise
      then(resolve, reject) {
     
        setTimeout(() => {
     
          resolve(this.name)
        }, 2000)
      }
    }
    class User1 {
     
      constructor(name) {
     
        this.name = name
      }
      // 在类中定义一个then方法,这个类也就相当于promise
      then(resolve, reject) {
     
        setTimeout(() => {
     
          resolve(this.name)
        }, 2000)
      }
    }
    async function get() {
     
      // 下面同时进行
      let user =  new User('你是大傻逼')
      let user1 =  new User1('你是大傻逼')
      
      // 下面是马上得到的user
      console.log(user);
      console.log(user1);
      
      // 下面使用awit是等待四秒后才得到的
      let name = await user
      let name1 = await user1
      console.log(name);
      console.log(name1);
    }
    get()

    // 实现并行的方式2
    async function get2(){
     
      let res = await Promise.all([new User('小煞笔'),new User1('大傻逼')])
      console.log(res); // ["小煞笔", "大傻逼"]
    }
    get2()

下面是返回的user
js补充6_第1张图片

任务处理顺序:正常在时间轮询的情况下,在主线程处理完正常的事件,就处理异步产生的回调事件,把回调函数的事情放到主线程这里进行,但其实中间还有一步,就是promise的异步事件,这就涉及到了宏任务和微任务,微任务的处理顺序是排在宏任务前面的,也就是在处理完正常的事件后就会处理微任务,也就是promise 的回调函数,把promise的回调函数放到 主线程这里,然后就处理宏任务,也就是异步的回调函数

宏任务队列中,比如定时器,当代码往下走时,遇到定时器就会把定时器放到红任务队列,其实这时候他就开始执行了,当主线程的任务和promise的任务执行完之后,就会马上把定时器的回调函数执行,如果有两个定时器的时候,遇到的时候也是立即执行的,然后哪个先执行完毕,当微任务队列执行完后,就优先执行哪个

微任务执行逻辑,其实跟上面定时器的执行逻辑是一样的,也就是new promise里面的东西是同步执行的,马上执行,然后then或者catch里面的是回调函数,会放到微任务队列里面

dom渲染是放在宏任务里面的,也就是说如果如果把script标签放到dom前面的话,会导致只有等js导入完成才会 去 执行dom渲染

使用promise微任务来处理逻辑

// 比如有一段代码需要执行很长的时间,为了不影响后面代码的执行,就可以把他定义打定时器获取promise里面
// 定时器方式
function sum(num) {
     
  return new Promise(resolve => {
     
    setTimeout(() => {
     
      let count = 0
      for (let i = 0; i < num; i++) {
     
        count = num--
      }
      resolve(count)
    })
  })
}

async function get() {
     
  let count = await sum(500)
  console.log(count);
}

get()
console.log('大傻逼');

// 微任务方式
async function num1(num){
     
    let res = await Promise.resolve().then(()=>{
     
      let count = 0
      for (let i = 0; i < num; i++) {
     
       count += num--
      }
      return count 
    })
    console.log(res);
}
num1(10000)
console.log('你是傻逼');

你可能感兴趣的:(JS)