博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
async函数使用场景
阅读量:6801 次
发布时间:2019-06-26

本文共 2007 字,大约阅读时间需要 6 分钟。

async是Generator函数的语法糖,比起Generator更加具有语义。定义一个Generator函数需要类似于如下方式:

function * test(){    yield 1;    yield 2;    return 3}var a = test() //不会执行a.next();a.next();复制代码

定义async函数只需要:

async function test(){    var a = await 1    var b = await 2    return b}test().then((res)=>{ // res为test函数的返回值。可见async会返回一个Promise对象})复制代码

在实际使用中await后面实际上更多的是一个异步函数,例如一个promise对象的操作结果

// 模拟接口Afunction getA(){    return new Promise((resolve,reject)=>{        setTimeout(()=>{            let res = Math.random()            if(res>0.5){                resolve(res)            } else {                reject(res)            }        },2000)    })}// 模拟接口Bfunction getB(){    return new Promise((resolve,reject)=>{        setTimeout(()=>{            let res = Math.random()            if(res>0.5){                resolve(res)            } else {                reject(res)            }        },2000)    })}async function print(){    let a = await getA().catch((error)=>{        console.log(error)    })    let b = await getB()    return [a,b]}print().then((res)=>{    console.log('成功',res)}).catch((err)=>{    console.log('错误',err)})复制代码

上述print函数a变量值需要等到getA执行完毕才能获得。getB需要await getA()执行完毕才会执行。所以print的执行时间是getA和getB的和。这就是所谓的同步方式执行异步函数。 不过使用同步方式执行异步函数的方式也有局限性。

  1. 如果有耗时任务将会阻塞。 假如getA需要大约耗时10s,则getB不得不等到getA执行完毕。
  2. 如果async内有一个函数发生错误,则函数不再执行,错误将直接被catch捕捉,例如getA状态为reject.则test().catch((error)=>{})将捕捉错误,getB不会执行。如果需要getB继续执行,需要添加try...catch:
async function print(){    try{        let a = await getA()    }catch(error){            }    let b = await getB()    return [a,b]}复制代码

async使得异步操作流程更加有序化,在promise中

getA()getB()复制代码

虽然getA定义在前面,但却不一定会先于getB返回值,这样在实际开发中可能给我们造成麻烦,因为实际开发中数据是由依赖的和有先后之分的。所以为了有序化,单纯使用promise我们不得不使用如下类似代码:

getA().then(()=>{    return getB()}).then(()=>{    return getC()})...复制代码

写的越多,代码就不具有可读性,也不利于调试。使用上述的async+await可以很爽地写代码啦.

async function getAsyncData(){    let a = await getA();    let b = await getB()}getAsyncData().then(()=>{    })复制代码

我们把异步操作的函数(例如ajax,读取文件等)定义在async函数内,配合await可以使得异步操作有序化,即先getA再执行getB.

转载地址:http://cjfwl.baihongyu.com/

你可能感兴趣的文章
Linux下awk内置变量使用介绍
查看>>
Struts2 REST插件远程执行命令漏洞全面分析,WAF支持检测防御
查看>>
如何在Ubuntu中安装语音聊天工具Discord
查看>>
一篇文章学会shell工具篇之sed
查看>>
你需要知道的、有用的Python功能和特点
查看>>
数据可视化,我应从何开启?
查看>>
如何对抗勒索软件即服务?
查看>>
勾勒Tor的全球使用情况
查看>>
云API,让应用程序“动”起来!
查看>>
《Linux高性能服务器编程》——1.2 封装
查看>>
开发者自述:我是这样学习 GAN 的
查看>>
大数据时代:预测未来5年各行业发展趋势
查看>>
《Servlet和JSP学习指南》一1.4 ServletRequest
查看>>
你不得不知的推进DevOps实践的四大趋势
查看>>
华天动力OA客户管理系统如何将细节处理到完美?
查看>>
国美在线“8.3男人节”来了 3C家电百货五折扫货就在今天
查看>>
IBM推出开源软件开发工具Quarks,助力企业开发物联网应用
查看>>
《高阶Perl》——第1章 递归与回调 1.1 十进制到二进制的转换
查看>>
关于网联平台的出世,有必要解释清楚这几个问题
查看>>
国家工业信息安全产业发展联盟成立
查看>>