async await 个人总结

认识async await 首先要从单个熟悉

  • async
    官方介绍:
    async function 声明将定义一个返回 AsyncFunction 对象的异步函数。
    个人理解:
    1. 首先async function会申明定义一个异步执行的函数,无阻塞,不会阻塞后面代码执行
    2. 该函数的返回值是一个Promise对象

执行以下代码

async function testAsync() {
    return '茶树菇'
  }
  console.log(testAsync());
/*打印结果:
Promise
result: "茶树菇"
status: "resolved"
“Promise”原型*/

打印结果可以看出,async 可以将其后的函数执行结果转为Promise对象
既然如此那以下操作也是可行的

testAsync().then(r => {
    console.log(r);
  });//"茶树菇"

由以下打印结果可知async function声明函数是异步函数

function t() {
  return new Promise(resolve => {
    resolve('hah')
  })
}
async function t1() {
  const a = await t()
  // console.log(a);
  console.log('t1函数里');
}
t1()
console.log('我在t1函数调用后');
/*打印结果:
[Log] 我在t1函数调用后
[Log] t1函数里
*/

  • await
    官方介绍
    await 操作符用于等待一个Promise 对象。它只能在异步函数 async function 中使用。

    个人理解:
    官方注释await是在等待一个Promise对象,其实没有限制,只是根据等待到的结果类型的不同有不同的操作,如果等到的就是个结果,则await就返回这个值,如果等到的是一Promise对象,则await会阻塞后面代码执行,等待Promise的结果(由于awaitasync function申明的异步执行函数,所以不会影响该函数外的其他代码执行,只影响内部)
    注意:如果await等待的Promise执行结果除了resolve外,还有异常处理reject,则最好用.catch(err => err)去接收处理异常, 例const a = await t().catch(err => err)

async function testAsync1() {
    return "茶树菇";
}

function testAsync2() {
    return new Promise(resolve => {
      resolve('茶树菇')
    })
}

function testAsync3() {
    return "茶树菇";
}

async function testFn() {
    const v1 = await testAsync1();
    const v2 = await testAsync2();
    const v3 = await testAsync3();
    console.log(v1);//"茶树菇"
    console.log(v2);//"茶树菇"
    console.log(v3);//"茶树菇"
//由此可见`await`等待的不一定是个`Promise`对象,也可以是个值
}
testFn();

  • 为什么用async await,对比Promise的优缺点在哪?
    模拟个使用场景,如下代码
    需求:随机产生一个1~2之间的随机数,用延时器模拟异步操作,判断该值,如果小于一就成功,大于一失败
//用Promise实现:
function test(resolve, reject) {
    var timeOut = Math.random() * 2;
    console.log('随机数为:' + timeOut);
    setTimeout(function() {
      if (timeOut < 1) {
        resolve('小于1, 成功')
      } else {
        reject('大于1,失败')
      }
    }, timeOut * 1000)
  }
  new Promise(test).then((result) => {
    console.log(result);
  }).catch((reason) => {
    console.log(reason);
  })

打印结果:
屏幕快照 2018-03-12 下午2.05.09.png
function test2() {
    var timeOut = Math.random() * 2;
    console.log('随机数为:' + timeOut);
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        if (timeOut < 1) {
          resolve('小于1, 成功')
        } else {
          reject('大于1,失败')
        }
      }, 1000)
    })
  }
  async function asyncFn() {
    const v3 = await test2().catch(er => er)
    console.log(v3);
  }
  asyncFn()

看代码其实单一的异步处理链并不能看出async await的优势,但是如果需要处理多个Promise组成的处理链,就能看出区别
假设需求为:分布完成,每一步都需要上一步的结果:

//每次调用时间都增加200
function logTimeOut(n) {
    return new Promise(resolve => {
      setTimeout(() => resolve(n + 200), n)
    })
  }
//第一步
  function stepOne(n) {
    console.log('第一步所用的时间', n);
    return logTimeOut(n)
  }
//第二步将第一步的结果加上200作为第二部的初始时间
  function stepTow(m, n) {
    console.log('第二部所用的时间',m, n);
    return logTimeOut(n + m)
  }
//第三步将第二步的结果加上200作为第三步的初始时间
  function stepThree(k, m, n) {
    console.log('第三部所用的时间', k, m, n);
    return logTimeOut(k + m + n)
  }

首先用Promise实现

//promise实现
  function doIt() {
    console.time("doIt");
    // 第一步初始时间
    const time1 = 200;
    stepOne(time1).then(time2 => {
      return stepTow(time1, time2).then(time3 => [time1, time2, time3])
    })
    .then(timeArr => {
      const [time1, time2, time3] = timeArr
      return stepThree(time1, time2, time3)
    })
    .then(result => {
      console.log('总共计算用时', result);
      console.timeEnd('doIt')
    })
  }
doIt()

使用async awiat

// async await 实现
  async function startIt() {
    console.time("startIt")
    const time1 = 200;
    const time2 = await stepOne(time1)
    const time3 = await stepTow(time1, time2)
    const result = await stepThree(time1, time2, time3)
    console.log('总共计算用时', result);
    console.timeEnd('startIt')
  }

打印结果:
屏幕快照 2018-03-12 下午3.02.22.png

这样对比就能明显看出区别Promise实现的代码逻辑复杂,不清晰,不直观,而通过async await,可以将异步逻辑,用类似于同步的代码实现,简洁明了

这是到目前为止的个人理解,转载请标明出处

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容