es6 async与await实战
在使用js的时候,我们经常会遇到一个问题,就是我们需要等待请求返回再做下一步处理,之前的处理方式是通过ajax的success或者callback之类的方法,不过一层一层真的恶心,而且只是针对单个页面的业务,如果我们想把增删改查的业务封装起来,基本没可能,或者封装的很不优雅
下面来说一说通过async和await方式来辅助请求和封装
首先我们定义一个类,定义一个async方法,才可以使用await
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | class JForm extends React.Component { handleSubmit = () => { ... this .handleInsert(obj) ... } async handleInsert(obj) { let url = '...' let res = await insert(url, obj) if (res){ this .hideModal(); this .props.refresh(); } }; } |
上面是一个react的一段代码,当触发handleSubmit 表单提交方法,会调用handleInsert方法,此时会等await insert 执行完返回结果再执行if(res)的判断
我们再来看看重要的insert方法应该怎么写呢
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | export function insert(url, obj) { return new Promise( function (resolve, reject) { const hide = message.loading( '正在新增...' , 0); let res = apiPost(url, obj).then( function (res) { const {data, ret, msg} = res; hide(); if (ret==200) { Success(`添加1条数据`); } else { Error(res.msg); } resolve(ret==200? true : false ) }) }) } |
看起来貌似有点复杂?其实核心的代码只有下面的部分
1 2 3 4 5 | export function insert(url, obj) { return new Promise( function (resolve, reject) { resolve(ret==200? true : false ) }) } |
对的,只有 return new Promise 和 resolve() ,resolve里面的data就是let res要接收的值了,我们可以在请求后将结果传入resolve即可。
如果场景不是react和class用不了async 和await 怎么办呢?其实我的insert方法下还有调用一个方法apiPost体也有resolve,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | export const apiPost = (url, configObj) => { if ( typeof (configObj) === 'undefined' ) { configObj = [] } return new Promise( function (resolve, reject) { const reqUrl = base.host + '/' + url + '?token=' + localStorage.getItem( 'token' ); axios.post(reqUrl, qs.stringify({...configObj})).then( response => { let resulData = response.data resolve(resulData) } ); }) } |
在insert可以使用.then(function (res) { 来接收resolve过来的值,不过一对比就会发现多了很多(),{}了,不过是底层一点方法,只写一两次,所有就无所谓啦,最重要还是保持视图应用层的简洁
不吹水了,新年快乐
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!