async/await使用心得
2017-12-05 18:30
267 查看
运行环境
node7以上支持此方法chrome55以上支持此特性,一般我们用于node开发中
async简介
async其实是promise的语法糖,被async标记过的方法,返回promise对象async的定义如下:
async function name([param[, param[, ... param]]]) { statements }
返回
AsyncFunction个人理解为就是一个promise实例
当这个 async 函数返回一个值时,Promise 的 resolve 方法将会处理这个值;当 async 函数抛出异常时,Promise 的 reject 方法将处理这个异常值。
await简介
await一般需要配合async标记的函数使用await 表达式会暂停当前 async function 的执行,等待 Promise 处理完成。
await标记的方法调用返回的值其实就是promise的resolve 方法返回的
若 Promise 正常处理(fulfilled),其处理结果作为 await 表达式的值,继续执行 async function。
若 Promise 处理异常(rejected),await 表达式会把 Promise 的异常原因抛出。
另外,如果 await 操作符后的表达式的值不是一个 Promise,那么该值将被转换为一个已正常处理的 Promise。
官方文档案例
正常的操作
function resolveAfter2Seconds(x) { return new Promise(resolve => { setTimeout(() => { resolve(x); }, 2000); }); } async function add1(x) { var a = resolveAfter2Seconds(20); var b = resolveAfter2Seconds(30); return x + await a + await b; } add1(10).then(v => { console.log(v); // prints 60 after 2 seconds. }); async function add2(x) { var a = await resolveAfter2Seconds(20); var b = await resolveAfter2Seconds(30); return x + a + b; } add2(10).then(v => { console.log(v); // prints 60 after 4 seconds. });
有异常的情况
async function f3() { try { //如果调用promise的reject方法,则会被异常捕获 var z = await Promise.reject(30); } catch (e) { console.log(e); // 30 } } f3();
今天写了一个模拟websocket的接口,代码中使用到了该特性,直接看源码
//websocket监听消息 ws.on('message', async function (message) { //注意匿名函数上使用了async标记,否则报错 var stockRequest = JSON.parse(message);//根据请求过来的数据来更新。 console.log("收到消息", stockRequest); let result = await startSendMessage(); }); /** * 发送消息 */ async function startSendMessage(){ for(let i=0,leni=PROVINCE_ARRAY.length;i<leni;i++){ for(let j=0,lenj=RESOURCE_ARRAY.length;j<lenj;j++){ var obj={} wsInstance.send(JSON.stringify(obj)); await sendResult(obj); } } return true } /** * 发送结果 * @param {object} 发送的结果 */ function sendResult(obj){ let timeStep=randomInterval(1000,4000); return new Promise(resolve => { setTimeout(() => { obj['result'] = getResult(); wsInstance.send(JSON.stringify(obj)); resolve("OK"); }, timeStep); }); }
参考资料
理解 JavaScript 的 async/await
MDN async标记说明
MDN await标记说明
相关文章推荐
- .NET 4.5 使用async和await关键字调用异步方法
- AsyncSocket使用心得
- .NET中async与await的使用
- async 和 await 被我这个新手第一次使用的笔记
- [原创.数据可视化系列之十二]使用 nodejs通过async await建立同步数据抓取
- 使用 Async 和 Await 的异步编程(C# 和 Visual Basic)
- C#的多线程——使用async和await来完成异步编程(Asynchronous Programming with async and await)
- async/await - 6.使用Promise.all()让多个await操作并行
- 演示C#里的async和await的使用
- 如何在.net4.0中使用.net4.5的async/await
- 异步爬虫: async/await 与 aiohttp的使用,以及例子
- IOS 开源库 asyncSocket 的使用心得
- await和async在C#一般处理程序(ashx)中的使用
- WP8中使用async/await扩展HttpWebRequest
- 不使用回调函数的ajax请求实现(async和await简化回调函数嵌套)
- await和async的使用方法
- .NET/C# 使用async和await关键字调用异步方法
- 使用 Async 和 Await 的异步编程 #Reprinted#
- 使用async await 封装 axios的方法
- 使用Async和Await进行异步编程(C#版 适用于VS2015) z