只要返回值为Promise,就可以使用async/await来处理异步服务器代码。请参阅文章末尾的业务用例。登录1.鉴权获取token2.使用token获取roleid3.使用token和roleid获取类似菜单的异步请求如axioswindow.fetchumi-requestdva/fetch等基本使用形式newPromise(request1).then(请求2(请求结果1)).then(请求3(请求结果2)).then(请求4(请求结果3)).then(请求5(请求结果4)).catch(handleexception(异常信息))直接在浏览器控制台改写如下代码asyncfunctionlogin(){constbaseUrl='http://127.0.0.1:3005';const{token}=awaitfetch(`${baseUrl}/auth`,{method:'POST',data:{username:'test',password:'xxxxxxx'},}).then(v=>v.JSON());//后面是thenonce因为fetch返回的不是Promise而是直接Response,response.json()返回Promiseconsole.log('1.token->',token);constroles=awaitfetch(`${baseUrl}/roles?token=${token}`).then(v=>v.json());console.log('2.roles->',角色);constmenus=awaitfetch(`${baseUrl}/menus?token=${token}&roles=${roles}`).then(v=>v.json());console.log('3.menus->',menus);}回调方法返回处理,以小程序为例,其他回调基本同理wx.request({url:'requestone',data:{x:'',y:''},header:{'content-type':'application/json'},success(res){wx.request({url:'Request2',data:res.data,header:{'content-type':'application/json'},success(res){......}})}})Rewrite1.封装一个PromiseRequestfunctionconstrequest=(url,options={headers:{}})=>{constbaseUrl='http://127.0.0.1:3005';constheaders={'content-type':'application/json',...options.headers,};const方法=options.method||'得到';constdata=options.data||'';returnnewPromise((resolve,reject)=>{wx.request({url:baseUrl+url,data,method,header:headers,success(res){resolve(res);},fali(err){reject(呃);},});});};2.业务代码constlogin=async()=>{const{data:{token},}=awaitrequest('/auth',{method:'POST',data:{username:'test',password:'xxxxxxx'}});console.log('1.token->',token);const{data:roles}=awaitrequest('/roles',{data:{token}});console.log('2.roles->',角色);const{data:menus}=awaitrequest('/menus',{data:{token,roles}});console.log('3.menus->',menus);};定时器修改constsleep=time=>{returnnewPromise(resolve=>{console.log(`等候${time}秒...`);setTimeout(()=>{resolve(true);},time*1000);});};使用constrequest=require('axios');request.defaults.baseURL='http://127.0.0.1:3005';asyncfunctionlogin(){const{data:{token},}=awaitrequest('/auth',{method:'POST',data:{username:'test',password:'xxxxxxx'}});console.log('1.token->',token);等待睡眠(2);const{data:roles}=awaitrequest('/roles',{params:{token}});console.log('2.roles->',角色);等待睡眠(2);const{大ta:menus}=awaitrequest('/menus',{params:{roles,token}});console.log('3.menus->',menus);}传统的任务间隔定时器的setInterval是每段定时调用一个任务,不关心任务持续时间,期望一个定时器关心任务持续时间的间隔,将任务作为间隔定时器,关心任务的持续时间,即等到所有任务都执行完,然后在一定的时间间隔开始下一个任务。constinterval=async(task,ti??me,id)=>{while(true){if(!global[id])break;awaitnewPromise(res=>{res(task());});等待睡眠(时间);}};constaddInterval=(task,ti??me=5)=>{constid=Symbol();全局[id]=true;setTimeout(()=>{间隔(任务,时间,id);},0);返回ID;};constdelInterval=id=>{global[id]=false;};以上面的登录为例constid=addInterval(login,2);//任务间隔2ssetTiemt(()=>{//在某个时间段或某个操作期间停止循环delInterval(id);},xxx);服务器端代码示例constapp=require('express')();constbodyParser=require('body-parser');const{sleep}=require('./tools');app.use(bodyParser.json());app.use(bodyParser.urlencoded({extended:true,}));app.all('*',函数(req,res,next){res.header('Access-Control-Allow-Origin','*');res.header('Access-Control-Allow-Headers','X-Requested-With');res.header('Access-Control-Allow-Methods','PUT,POST,GET,DELETE,OPTIONS');res.header('X-Powered-By','3.2.1')??;res.header('Content-Type','application/json;charset=utf-8');next();});app.post('/auth',(req,res)=>{const{username}=req.body;console.log(username);res.send({id:1,name:username,age:18,token:`absfgsakjdhjskahdsklh`,});});app.post('/auth/slow',async(req,res)=>{const{username}=req.body;console.log(username);awaitsleep(4);res.send({id:1,name:username,age:18,token:`absfgsakjdhjskahdsklh`,});});app.get('/roles',(req,res)=>{res.send([1,2,3]);});app.get('/roles/slow',async(req,res)=>{awaitsleep(4);res.send([1,2,3]);});app.get('/menus',(req,res)=>{res.send([{name:'首页',path:'/'},{姓名:'用户管理',path:'/users'},]);});app.get('/slow',async(req,res)=>{constsecond=Math.round(Math.random()*7)+1;awaitsleep(second);//res.append('Access-Control-Allow-Origin','*')res.send({code:0,data:Date.now(),msg:'ok',});});app.listen(3005,()=>{console.log(`服务器运行时间:${Date.now()}`);});
