欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ES6(7)之Async和await

程序员文章站 2023-12-21 22:48:40
...

先谈JavaScript的异步处理

JavaScript是一门单线程的编程语言,如果不设计异步处理的机制,很容易因为一些耗时较长的I/O而造成线程阻塞,从而给人不好的程序体验。

以前进行异步处理的方式:

回调函数 :可以通过设置一些事件的回调函数(callBack)从而达到异步处理

事件监听 :事件监听基本是基于回调函数的支持

发布/订阅 :发布订阅是一种良好的设计模式,监听发布者的事件从而达到异步处理

Promise对象 :Promise对象可以解决函数回调的嵌套,但是会导致代码的横向发展(链式操作的弊端)

ES7的Async

Async是给函数前面设置的关键字,await是只能在async作用域下使用关键字,它可以监听Promise对象,当Promise对象的状态改变后,才进行后面的代码操作。

几个优点

  • 函数变成良好的纵向
  • 代码看起来就像是同步的代码
  • 能够进行标准的trycatch操作
    //sleep是一个设置的延迟函数
  var sleep = function (time) {
    return new Promise(function (resolve, reject) {
      setTimeout(function () {
        reject() // time 时间后将Promise的状态改为reject
      }, time);
    })
  };

  let hello = async() => { //async 作为箭头函数的关键字
    try {
        console.log('i am 1')
        await sleep(3000)
        console.log(`this won't happen`)
    } catch (err) {
      console.log('i am 3')
    }
  }
  hello()
  console.log('i am 2')

sleep是一个延迟函数,调用的时候会在3000ms之后改变Promise对象的状态,所以在try的作用域内会在执行了console.log('i am 1')之后等待3000ms,而此时async作用域的代码会按顺序向下执行,则会执行到console.log('i am 2'),当在3000ms之后,Promise对象状态变为reject,这时会被catch检测到,所以不会再执行try里面的代码,而且执行catch下的代码

上一篇:

下一篇: