zoukankan      html  css  js  c++  java
  • promise的常用情况

    因为js是单线程的,所以一旦代码中有报错,就不会执行下面的了,如下333就未打印

    console.log(111)
    throw Error(222)
    console.log(333)

    好像与promise没关系,哈哈。

    1.传说中的 setInterval 与 setTimeout
    它们是单独的线程执行计数的(因为 JavaScript 引擎是单线程的, 如果处于阻塞线程状态就会影响记计时的准确),

    它们并不会阻塞js的执行,如下代码先打印的是222
    let timer  = setTimeout(()=>{

    console.log(111);

    },1000)

    console.log(222);

    这时候如果我们想等到111打印后再打印222怎么办(实际项目中并不提倡使用延时器),代码如下

    new Promise((resolve,reject)=>{

    let timer  = setTimeout(()=>{

    console.log(111);

    resolve();

    },1000)

    }).then(()=>{

    console.log(222);

    })

    2.异步 http 请求线程

     XMLHttpRequest 在连接后是通过浏览器新开一个线程请求,所以它与js也是异步的

    所以现在大多数请求的方式,想axios,fetch等其实都已经用promise封装过了(请求成功resolve()失败reject()),比如常遇到的当我获取到请求的数据(走then对应resolve)或请求失败(走catch对应reject)后在进行一系列操作。但是当对多个请求的返回值同时处理的时候就会造成嵌套,这样会使代码显得非常冗长丑陋,难以维护,所以这时候就用到了await,例如:
    const init = async ()=>{
      let a = await axios().catch(err=>err);
      let b = await axios().catch(err=>err);
      let c = await axios().catch(err=>err);
      return a&&a.num&&b&&b.num&&c&&c.num&&a+b+c
    }

    最后附上Promise.all和Promise.race的使用理解

  • 相关阅读:
    Java设计模式—单例模式
    Java集合框架
    Java进程和线程
    Java IO
    Java异常类
    Java面向对象—抽象类和接口
    Java面向对象—多态
    Java面向对象—继承
    Java面向对象
    Java基础语法
  • 原文地址:https://www.cnblogs.com/live-to-talk/p/12787755.html
Copyright © 2011-2022 走看看