async/await的使用方法
什么是async和await
你要想理解语法,可以先从两个单词的基本意思来进行了解.async是异步的简写,而await可以堪称async wait的简写。明白了两个单词,就很好理解了async是声明一个方法是异步的,
await是等待异步方法完成。注意的是await必须在async方法中才可以使用因为await访问本身就会造成程序停止堵塞,所以必须在异步方法中才可以使用。
async到底起什么作用?
async是让方法变成异步,这个很好理解,关键是他的返回值是什么?我们得到后如何处理?
根据以前的经验,我们希望用return直接返回async函数的值,但是如果真是这样,还有await什么作用,我们写段代码测试一下。
async function testAsync(){ return 'Hello async'; } const result = testAsync(); console.log(result);
在终端里用node执行这段代码,你会发现输出了Promise { ‘Hello async’ },这时候会发现它返回的是Promise。
node test.js
Promise { 'Hello async' }
async就是将函数返回值使用 Promise.resolve 包裹了下,和then中处理返回值一样,并且async只能配合await使用
await在等什么?
await一般在等待async方法执行完毕,其实await等待的只是一个表达式,这个表达式在官方文档里说的是Promise对象,可是它也可以接受普通值。我们写一段代码来验证一下这个结果。
在程序中我们有用async的方法,也有普通的方法。最后在控制台输出时,你会发现都可以直接输出。
function getSomething(){ return 'something'; } async function testAsync(){ return 'Hello async'; } async function test(){ const v1=await getSomething(); const v2=await testAsync(); console.log(v1,v2); } test();
async/await同时使用
通过前面两个例子已经分别了解async和await,我们来作个虚假的例子,看一下等待问题。这只是一个虚假的,实际项目中多是去后台请求数据,等数据回来后进行执行。
function takeLongTime() { return new Promise(resolve => { setTimeout(() => resolve("long_time_value"), 1000); }); } async function test() { const v = await takeLongTime(); console.log(v); } test();
所以调用的时候就可以这样简洁用 不用再then语法了
takeLongTime().then(()=>{ }).catch((err)=>{ })
项目应用 异步的数据同步化
import { subPicture } from '@/api/user' // async await 基于promise 所以 这里的封装也是基于了这个 async getJDCulbShow(i) { try { const res = await subPicture(i) if (res.ret === 0) { this.$message({ message: '成功', type: 'success' }) console.log(res) } else { this.$message({ message: res.msg, type: 'error', center: true }) } } catch (err) { console.log('获取数据失败', err) } } this.getJDCulbShow(formData)
使用前后的对比
// 用 promise 获取文件内容 function getFileContent(fileName) { const promise = new Promise((resolve, reject) => { const fullFileName = path.resolve(__dirname, 'files', fileName) fs.readFile(fullFileName, (err, data) => { if (err) { reject(err) return } resolve( JSON.parse(data.toString()) ) }) }) return promise } // 使用前 // getFileContent('a.json').then(aData => { // console.log('a data', aData) // return getFileContent(aData.next) // }).then(bData => { // console.log('b data', bData) // return getFileContent(bData.next) // }).then(cData => { // console.log('c data', cData) // })
// 使用后 async function readFileData() { // 同步写法 try { const aData = await getFileContent('a.json') console.log('a data', aData) const bData = await getFileContent(aData.next) console.log('b data', bData) const cData = await getFileContent(bData.next) console.log('c data', cData) } catch (err) { console.error(err) } }
总结
// async await 要点: // 1. await 后面可以追加 promise 对象,获取 resolve 的值 // 2. await 必须包裹在 async 函数里面 // 3. async 函数执行返回的也是一个 promise 对象 // 4. try-catch 截获 promise 中 reject 的值
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示