异步处理相关问题学习

239 阅读3分钟

这是我参与2022首次更文挑战的第8天,活动详情查看:2022首次更文挑战

目标

  • promise使用方式
  • async、await的使用

同步异步相关概念

  • JavaScript是单线程
    • 单线程:程序都是按顺序执行,同一时刻只会发生一件事情。如果一个函数依赖于另一个函数的结果,它只能等待那个函数执行完成之后才能继续执行
  • 同步和异步:
    • 阻塞:当浏览器里面的一个web应用进行密集运算还没有把控制权返回给浏览器的时候,整个浏览器就像冻僵了一样,这叫做阻塞
    • 同步阻塞:任务A调用任务B,任务B处理获得的结果之后在返回给A。A在这个过程中,需要一直等待B的处理结果,没有拿到结果之前,需要A一直等待和确认调用方法的结果是否返回,拿到结果之后才会继续往下执行。没有拿到结果之前,就一直等待着,就造成了阻塞。
    • 异步行为不需要等待某个异步操作而阻塞线程执行。A调用B,不需要等待B的结果,B通过状态、通知等来告诉A或者回调函数来处理。多个任务执行时,互不影响。有了结果,在通过状态或者回调函数进行处理。

异步处理方案:

  • 回调:通过回调函数来处理异步,串联多个异步操作,容易造成回调地狱,可读性差,可维护性不好,关联性比较强
  • 自定义事件
function double(value, success, failure) {
  setTimeout(() => {
    try {
      if (typeof value !== 'number') {
        throw 'Must provide number as first argument';
      }
      success( 5 * value)
    } catch (e) {
      failure(e)
    }
  }, 1000);
}

const successCallback = x =>  double(x, y=> console.log(`Success: ${y}`))
const failureCallback = e => console.log(`Failure:${e}`)
double(3, successCallback, failureCallback)

Promise使用

ES6的Promise对象是一个构造函数,用来生成Promise实例。

  • ES6的Promise类型,ECMAScript 6增加了对Promise/A+规范的完善支持。
    • promise有三个状态:pending,fulfilled,rejected
    • 可以通过new 来实例化。创建的时候需要传入执行器(executor)函数作为参数,executor接收resolve和reject两个参数,并且都是函数。
    • then方法:会返回一个新的Promise对象, 但是状态会有几种情况:
      • then 的回调函数中没有返回值,then就会返回一个状态为: resolved 的 promise 对象
      • then 的回调函数返回值是 非 promise 的值, then就会返回一个状态为: resolved 的 promise 对象,另外会把返回值,传递给 下一个 then
      • then 的回调函数返回值是 promise 对象,then 就直接返回这个 promise 对象,具体的状态可以由我们自己定义,具体传递的值,也由我们自己定义
    • Promise的方法:resolve、reject、all、race、finally、catch

关于promise前面也有仔细的讲解,这里不做过多介绍了就。

async await使用

  • async放在函数声明之前,使其成为async function。异步函数中使用await关键字调用异步代码
  • await关键字与异步函数一起使用
  • 使用async/await 改造promise