在用uniapp开发一个项目时,有这样一个需求:用户首次登录后,uniapp自动保存用户名密码,之后不管是再次打开项目(打开项目时登录状态已失效)还是 请求接口(接口返回登录失效)时,都会先自动默认的登录,然后再进行之后的操作。

  比如页面需要调用功能接口1、2,但是必须是登录状态。如下图所示:

  

  根据图中的逻辑流程可以断定共有 登录接口、功能接口1、功能接口2 三个request请求,我们抛开要跳转登录页的情况下,那么打开页面会有两种需要特殊处理的情况:

  1.没有登录状态,程序默认调用已存的用户名和密码去调用登录接口,接口登录成功后再继续调用功能接口1和2。

  2.页面已存在登录状态(比如vuex判断是否登录),但是调用接口1或者2时返回需要登录的状态(可能页面停留时间过久,服务器保存的登录状态已失效),这时需要跳到第一种情况去执行。

  

  根据上述的两种情况,我们常见的解决办法就是

 //页面执行
if(!loginStatus){//页面判断是否登录
login();
}else{
server();
}
//假如server中的catch为接口返回登录失效,需要重新登录
function server(){ server1Promise().then(()=>{
}).catch(()=>{
login();
})
server2Promise().then(()=>{
}).catch(()=>{
login();
})
}
function login(){
loginPromise().then(()=>{
server();
})
}

  这样会有很多问题,比如  无法分开调用接口1、接口2(有时候页面逻辑会需要分开调用); 同时调用接口1和2,都返回需要登录状态时,会重复去请求登录接口,进而重复请求接口1和2。

  那么就需要另一种解决方法能同时解决这个问题! 

  

///  request.js
const request = (data,url) = >{
return new Promise((s,f)=>{
uni.request({//也可以是其他的接口请求
complete(r){
if(r.statusCode == 200)
s(r);
else
f(r);
},
url:url,data:data
})
})
} let isLogin =false;//是否正在登录
let loginStatus = async function () { return true}();//登录结果,默认可以登录
const _req = async (_d,_u)=>{
return new Promise((s,f)=>{
let _let_go = await loginStatus.catch(()=>{return false;});
if(_let_go){
request(_d,_u).then((r)=>{
s(r)//接口返回正常
}).catch(()=>{
//假使catch是调用业务接口返回要登录
autoLogin();//自动登录
let _let_go_n = await loginStatus.catch(()=>{return false;});
if(_let_go_n){
request(_d,_u).then((r)=>{ s(r)}).catch(()=>{ f({status:0,msg:'请登录'}) }) //再次请求,如果还是失败就不再继续
}else{ f({status:0,msg:'请登录'})}
})
}else{
//已经调用了登录接口,还是失败,那么跳转到登录页
f({status:0,msg:'请登录'})
}
});
} //自动登录
const autoLogin = ()=>{
if(isLogin ){return}
var _f = ()=>{
isLogin =true;
return new Promise((s, f) => {
var userinfo= uni.getStorageSync('userinfo');//读取保存的用户名密码
if(userinfo){
request(userinfo,'login').then(()=>{isLogin =false;s(true)}).catch(()=>{isLogin =false;s(false)});
}else{isLogin =false;s(false)} })
}
loginStatus = _f();
} //业务接口
const server1 = (_d)=>{
return _req(_d,'server1')
}
const server2 = (_d)=>{
return _req(_d,'server2')
} //登录接口,登录接口要和autoLogin分开,在login成功后要保存用户名和密码
const login = (_d)=>{ ... }

export default {server1,server2,login } /// page.vue
import request from 'request.js'
...
业务逻辑
...
request.server1().then()
...
业务逻辑
...
request.server2().then()

JS利用async、await处理少见的登录业务逻辑的更多相关文章

  1. [.NET] 利用 async & await 的异步编程

    利用 async & await 的异步编程 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/5922573.html  目录 异步编程的简介 异 ...

  2. [.NET] 利用 async & await 进行异步 IO 操作

    利用 async & await 进行异步 IO 操作 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/6082673.html  序 上次,博主 ...

  3. 利用 async & await 的异步编程

    走进异步编程的世界 - 开始接触 async/await 利用 async & await 的异步编程 async 的三大返回类型 公司技术需求备忘录

  4. 如何利用动态URL提升SEO及处理业务逻辑

    如果你正在建设一个新网站或者对现有网站重新设计,我们认为应该将网站的 URL 转换为用户友好的 URL,或搜索引擎友好的 URL,这类 URL 也称为语义 URL(Semantic URL).哪些UR ...

  5. JavaScript 利用 async await 实现 sleep 效果

    const sleep = (timeountMS) => new Promise((resolve) => { setTimeout(resolve, timeountMS); }); ...

  6. 理解 js的 async/await

    async 和await 在干什么? async  用于声明一个function是异步的 await用于等待一个异步方法执行完成(其实我理解的是等待的是一个表达式,就是一个结果), 其中  await ...

  7. sso 登录业务逻辑

  8. How Javascript works (Javascript工作原理) (四) 事件循环及异步编程的出现和 5 种更好的 async/await 编程方式

    个人总结: 1.讲解了JS引擎,webAPI与event loop合作的机制. 2.setTimeout是把事件推送给Web API去处理,当时间到了之后才把setTimeout中的事件推入调用栈. ...

  9. promise 进阶 —— async / await 结合 bluebird

    一.背景 1.Node.js 异步控制 在之前写的 callback vs async.js vs promise vs async / await 里,我介绍了 ES6 的 promise 和 ES ...

随机推荐

  1. CodeChef October Lunchtime 2019 Division 2

    HIT: Khaled in HIT 题目描述 Khaled 教练是 HIT(Hag Institute of Technology)一位名师.但是,他有一些困扰. 最近,Khaled 教练正在教一门 ...

  2. LibreOJ #6000. 「网络流 24 题」搭配飞行员

    二次联通门 : LibreOJ #6000. 「网络流 24 题」搭配飞行员 /* LibreOJ #6000. 「网络流 24 题」搭配飞行员 二分图最大匹配 Dinic最大流 + 当前弧优化 */ ...

  3. seq2seq聊天模型(三)—— attention 模型

    注意力seq2seq模型 大部分的seq2seq模型,对所有的输入,一视同仁,同等处理. 但实际上,输出是由输入的各个重点部分产生的. 比如: (举例使用,实际比重不是这样) 对于输出"晚上 ...

  4. nodejs基础 用http模块 搭建一个简单的web服务器 响应JSON、html

    前端在开发中,大多会想浏览器获取json数据,下面来用nodejs中的http模块搭建一个返回json数据的服务器 var http = require("http"); var ...

  5. MySQL数据分析-(10)SQL基础操作之表操作

    大家好,我是jacky,很高兴跟大家继续分享MySQL数据分析实战课程,前面我们学习了库层面增删改查的SQL语句,这次课jacky将给大家介绍表层面的增删改查, (一)本课时的学习逻辑 表层面的增删改 ...

  6. python 安装 pyHook

    下载网站:https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyhook 查看python版本 C:\Users\k\Desktop\file_trans> ...

  7. CF1214D

    CF1214D 题意: 给你一个 $ n \times m $ 的矩阵,求最少用多少个障碍,将 $ (1,1) $ 到 $ (n,m) $ 的路径堵死. 题意: 因为可以将起点两边堵死,所以答案最多是 ...

  8. aop 通知的执行顺序

    private static final org.slf4j.Logger Logger = LoggerFactory.getLogger(LoggerAop.class); /** * 线程池 异 ...

  9. java工厂模式的测试

    /** * 工厂模式的测试 * <p> * 工厂方法模式 * 工厂方法模式是简单工厂模式的进一步抽象化和推广,工厂方法模式里不再只由一个工厂类决定那一个产品类应当被实例化,这个决定被交给抽 ...

  10. 组件基础之动态tab组件

    <template> <div id="demo31"> <p>-----------------组件基础之动态tab组件一---------- ...