await原理 js_async/await工作机制探究--NodeJS

ES6中的async/await让Promise变得更加简便,通常await处理的链式Promise会包裹在函数中,返回结果仍然是一个Promise对象。

但是当await直接处理链式Promise时,编译器是会返回一个Promise对象等待下次await,还是继续执行Promise对象直到返回结果不再是Promise?

测试环境

NodeJS v8.7.0

测试代码

1 const util = require('util');2

3 const prom2 = util.promisify((a, b, cb) =>{4 cb(null, a +b);5 });6

7 functionpromiseCal(a, b) {8 returnprom2(a, b)9 .then((val) =>{10 console.log(`value infirst then: ${val}`);11 return val * 2;12 })13 .then((val) =>{14 console.log(`Value insecond then: ${val}`);15 return val * 3

16 });17 }18

19 async functiontest() {20 //await getting value from chained promise

21 let val1 = await promiseCal(2, 4);22

23 console.log(`Typeof val1: ${typeofval1}\nFinal returned value: ${val1}`);24

25 //await getting value from another form

26 console.log(`[v2] Type of prom2: ${typeofprom2}`);27 let val2 = await prom2(4, 6)28 .then((val) =>{29 console.log(`[v2] Value infirst then: ${val}`);30 return val * 2;31 })32 .then((val) =>{33 console.log(`[v2] Value insecond then: ${val}`);34 return val * 3

35 });36 console.log(`[v2] Typeof val2: ${typeofval2}\n[v2] Final returned value: ${val2}`);37 }38

39 test()40 .catch(e => console.error(e.stack || e));

运行结果

value in first then: 6

Value in second then: 12

Typeof val1: number

Final returned value: 36

[v2] Type of prom2: function

[v2] Value in first then: 10

[v2] Value in second then: 20

[v2] Typeof val2: number

[v2] Final returned value: 60

结论

await操作符会沿着Promise链处理到返回结果不再是Promise位置,await语句返回的将是Primise链上最后一个then函数的返回值(或者抛出异常)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值