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

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

测试环境

NodeJS v8.7.0

测试代码

 const util = require('util');

 const prom2 = util.promisify((a, b, cb) => {
cb(null, a + b);
}); function promiseCal(a, b) {
return prom2(a, b)
.then((val) => {
console.log(`value in first then: ${val}`);
return val * 2;
})
.then((val) => {
console.log(`Value in second then: ${val}`);
return val * 3
});
} async function test() {
// await getting value from chained promise
let val1 = await promiseCal(2, 4); console.log(`Typeof val1: ${typeof val1}\nFinal returned value: ${val1}`); // await getting value from another form
console.log(`[v2] Type of prom2: ${typeof prom2}`);
let val2 = await prom2(4, 6)
.then((val) => {
console.log(`[v2] Value in first then: ${val}`);
return val * 2;
})
.then((val) => {
console.log(`[v2] Value in second then: ${val}`);
return val * 3
});
console.log(`[v2] Typeof val2: ${typeof val2}\n[v2] Final returned value: ${val2}`);
} test()
.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函数的返回值(或者抛出异常)。

async/await工作机制探究--NodeJS的更多相关文章

  1. async/await与promise(nodejs中的异步操作问题)

    此文只是粗略介绍使用方法,欲了解核心概念请参考官方文档或其他资料. 举例写文章详情页面的时候的一个场景:首先更改文章详情中的 PV,然后读取文章详情,然后根据文章详情中文章 Id 查阅该文章评论和该文 ...

  2. 抓住异步编程async/await语法糖的牛鼻子: SynchronizationContext

    长话短说,本文带大家抓住异步编程async/await语法糖的牛鼻子: SynchronizationContext 引言 C#异步编程语法糖async/await,使开发者很容易就能编写异步代码. ...

  3. How Javascript works (Javascript工作原理) (四) 事件循环及异步编程的出现和 5 种更好的 async/await 编程方式

    个人总结: 1.讲解了JS引擎,webAPI与event loop合作的机制. 2.setTimeout是把事件推送给Web API去处理,当时间到了之后才把setTimeout中的事件推入调用栈. ...

  4. ASP.NET 中的 Async/Await 简介

    本文转载自MSDN 作者:Stephen Cleary 原文地址:https://msdn.microsoft.com/en-us/magazine/dn802603.aspx 大多数有关 async ...

  5. ASP.NET 上的 Async/Await 简介

    原文链接 大多数有关 async/await 的在线资源假定您正在开发客户端应用程序,但在服务器上有 async 的位置吗?可以非常肯定地回答“有”.本文是对 ASP.NET 上异步请求的概念性概述, ...

  6. [翻译] Python 3.5中async/await的工作机制

    Python 3.5中async/await的工作机制 多处翻译出于自己理解,如有疑惑请参考原文 原文链接 身为Python核心开发组的成员,我对于这门语言的各种细节充满好奇.尽管我很清楚自己不可能对 ...

  7. [原创.数据可视化系列之十二]使用 nodejs通过async await建立同步数据抓取

    做数据分析和可视化工作,最重要的一点就是数据抓取工作,之前使用Java和python都做过简单的数据抓取,感觉用的很不顺手. 后来用nodejs发现非常不错,通过js就可以进行数据抓取工作,类似jqu ...

  8. JavaScript是如何工作的:事件循环和异步编程的崛起 + 5种使用 async/await 更好地编码方式!

    摘要: 深度理解JS事件循环!!! 原文:JavaScript是如何工作的:事件循环和异步编程的崛起+ 5种使用 async/await 更好地编码方式! 作者:前端小智 Fundebug经授权转载, ...

  9. JavaScript是如何工作的:事件循环和异步编程的崛起+ 5种使用 async/await 更好地编码方式!

    为什么单线程是一个限制? 在发布的第一篇文章中,思考了这样一个问题:当调用堆栈中有函数调用需要花费大量时间来处理时会发生什么? 例如,假设在浏览器中运行一个复杂的图像转换算法. 当调用堆栈有函数要执行 ...

随机推荐

  1. struts2.5动态方法绑定问题

    <global-allowed-methods>regex:.*</global-allowed-methods> <?xml version="1.0&quo ...

  2. September 10th 2017 Week 37th Sunday

    Dream most deep place, only then the smile is not tired. 梦的最深处,只有微笑不累. Everyday I expect I can go to ...

  3. 关于layui(layer)子页面获取不到父页面jQuery对象的问题。

    如果在使用layui-layer模块过程中,在子页面执行代码: window.parent.$("#id").val() 报错:window.parent.$ is not a f ...

  4. 基于easyui开发Web版Activiti流程定制器详解(六)——Draw2d详解(二)

    回顾: 上一篇我们介绍了Draw2d整体结构,展示了组件类关系图,其中比较重要的类有Node.Canvas.Command.Port.Connection等,这篇将进一步介绍Draw2d如何使用以及如 ...

  5. 1208. [HNOI2004]宠物收养场【平衡树-splay】

    Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特 ...

  6. 2018年1月12日--微信小程序----出错报告(40kb的原因)---并解决方法

    一. 报错的原因是因为,图片的文件太大了,已经超过了40kb...不能超过40kb. 在这里查看图片文件的大小:

  7. Redis——总结

    启动 redis 客户端,打开终端并输入命令 redis-cli.该命令会连接本地的 redis 服务. $redis-cli redis 127.0.0.1:6379> redis 127.0 ...

  8. Service通信

    1.简介 Service通信是双向的, 它不仅可以发送消息, 同时还会有反馈. 所以service包括两部分, 一部分是请求方( Clinet) , 另一部分是应答方/服务提供方( Server) . ...

  9. ajax表单提交post(错误400) 序列化表单(post表单转换json(序列化))

    序列化表单 使用serializeArray()序列化 转换成json格式 function arrayTOjson(node) { var b = "{"; for (var i ...

  10. JDK(八)JDK1.7&1.8源码对比分析【集合】HashMap

    前言 在JDK1.8源码分析[集合]HashMap文章中,我们分析了HashMap在JDK1.8中新增的特性(引进了红黑树数据结构),但是为什么要进行这个优化呢?这篇文章我们通过对比JDK1.7和1. ...