问题产生代码:
1. let isExists=false
2.
3. getProByXmbh(this.xmbh).then(res => {
4. if(res.data!==null)
5. {isExists=true ;}
6. });
7.
8. if(isExists===true) {}
此中第8行的判断一直为false的原因:getProByXmbh.then()是一个异步函数。在异步函数完成前,后续代码 (第7行以后)的已经执行了,所以无法根据后端返回的数据反映 isExists 的变化。
解决方式:
1. .await等待异步函数执行完成之后再执行后续,用.await需要方法前加async声明为异步函数。
const res= await getPro(this.xmbh) if (res.data!==undefined)
2.将需要用到后端返回值的逻辑都放入.then的方法体里面,此种方法可能存在局限性。
.then()可以理解为一个“定时器”,他就是一个大的回调函数体,里面都是各个回调函数,.then()函数里的所有函数都会在普通函数执行完,栈区空后,从队列一个一个压回栈执行
async和await :函数前加Async关键字,即为异步函数,Await用于等待一个Promise对象成果或失败后获取结果,而axios就是一个本质为promise的对象。
axios底层原理:在promise对象里面创建一个XmlHttpRequest对象(包裹),把url里的传到自己函数里的promis对象中的XMLHttpRequest,把请求结果通过promise对象传出去。
所以axios的.then .catch本质上同promise一样。 await函数就可以等待Promise对象兑现结果之后,获取到它的成功或失败的结果,获得axios库返回的结果,无需.then()和.catch()了
函数回调:
//没有回调函数时
function first(){ setTimeout(function(){ document.write('first'+<br>
) },1000) }
function second(){ document.write('second'+<br>
) }
//本来我这样把first放在前面是希望first先执行,再执行second,结果现在因为设置了setTimeOut,限制了first在1秒之后才执行 first(); second();//先执行了second()的内容,再执行first()的内容
//改良后
function first(c){
setTimeout(function(){
document.write('first'+<br>
)
c()
}}
//改为从函数内部实现先后顺序,将second函数传给first函数,在first函数里调用second就可以实现先输出first再到second了 。
2024.6.20