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
在这里插入图片描述

任务处理顺序:正常在时间轮询的情况下,在主线程处理完正常的事件,就处理异步产生的回调事件,把回调函数的事情放到主线程这里进行,但其实中间还有一步,就是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('你是傻逼');
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值