VUE异步函数return问题解决方案
异步函数return问题:
在写VUE前端代码时,会遇到将带有return结果的异步请求函数(如请求后台数据)设置为公共函数,在其他地方调用的场景。但是因为是异步请求数据,实际需要return的值在调用返回时,还未生成,所以导致return的内容为undefined。(见参考[1]的分析)
例如:公共函数和调用方式//公共函数:根据异步返回的内容确定return值true或false function a(){ api({ url: "/xxx/xxxx", //后端异步请求 method: "get", }).then((retData) => { if(retData.list.length > 0){ return true; }else{ return false; } }) } //调用位置 checkData(){ var result = a(); //result值为undefined!! }
调用返回时,因为异步请求还未结束,真正的结果还没有获取到,所以以上代码调用位置result得到的返回值为"undefined"。
解决方案:通过Promise + async/await实现异步return调用//公共函数:根据异步返回的内容确定return值true或false function a(){ return new Promise((resolve,reject)=>{ api({ url: "/xxx/xxxx", //后端异步请求 method: "get", }).then((retData) => { if(retData.list.length > 0){ resolve(true); }else{ resolve(false); } }) }) } //调用位置 async checkData(){ var result = await a(); //result值为期望的true或false }
2. 通过回调函数实现异步return调用//公共函数:根据异步返回的内容确定return值true或false function a(func){ api({ url: "/xxx/xxxx", //后端异步请求 method: "get", }).then((retData) => { if(retData.list.length > 0){ if(typeof func === "function"){ func(true); } }else{ if(typeof func === "function"){ func(false); } } }) } //调用位置 checkData(){ var result; a(function(ret){ result = ret; //result值为期望的true或false }); }
如果在回调函数里面将return返回值赋值给全局变量this.xxx,不能直接this.xxx = ret,需要将this作为变量来引用(参考[2]说明),方法如下:data() { return { result: true; }; } methods:{ checkData(){ a(function(ret){ this.result = ret; //这里报错:Uncaught (in promise) TypeError: Cannot read properties of undefined }); }, checkData2(){ var this_alias = this; a(function(ret){ this_alias.result = ret; //正确的写法 }); } }
参考:
[1] vue中函数为什么不能在异步操作里return出数据_PC_136的博客-CSDN博客_vue异步return
[2] JS中this的指向问题(Uncaught (in promise) TypeError: Cannot read property ‘$router‘ of undefined)_whitek387的博客-CSDN博客
区块链技术分享初步应用2区块链技术分享起源1简单分享了比特币的起源。既然比特币可以脱离物理介质,仅通过互联网就可以流通,那么比特币到底存在哪?比特币是怎么交易的?区块链到底是什么?今天这篇文章将一一进行解
新基建提了三年,谈起区块链你竟然只知道比特币今天跟大家分享新基建与区块链。01区块链有多受重视党的十九大以来,中共中央政治局已进行19次集体学习,其中三次与数字经济相关,主题分别是大数据人工智能和区块链,区块链的地位被提的最
酷睿i912900KROGZ690EXTREME首测重返战力之巅文章开头不妨先说结论1Corei912900K提升非常大,部分场景对比10900K提升能超过502Corei512600K性能已经与10900K持平,甚至略优3最高功耗是给时刻保持
区块链技术之哈希指针hello,大家好,我们第三期的区块链技术分享来啦,那么话不多说,我们开始吧。提起区块链,大家可能都会提到不可篡改。但是为什么区块链不可篡改呢?先给出答案,这与区块链的数据结构哈希
12代酷睿正式发布Corei912900K拉满5。2GHz,DDR5PCIe5。0齐发就在今天,英特尔正式发布第12代酷睿系列处理器,首发非锁频CPU包括酷睿i912900KKF酷睿i712700KKF酷睿i512600KKF。对于12代酷睿,英特尔做了数个总结,可
为什么有的网址开头是https,有的却是http?hello,大家好,我们第二期的区块链技术分享来啦,本期是candy分享公钥加密,也就是非对称加密。提到加解密,密码学这些词汇,很多人都退避三舍,如临大敌,觉得晦涩难懂,自己不想懂
区块链复盘及规划hello,大家好,好久不见分享区块链有一段时间了,也有近两周没有更新了。确实遇到了点小瓶颈,因为越研究越发现区块链涉及的技术领域很广,很多东西想讲清楚非一时之功,所以自己也有些困
英特尔AI顾问穿越星际守护宇航员健康近日,英特尔人工智能(AI)顾问与前沿开发实验室(FDL)的研究人员进行了一项关乎宇航员健康的具有里程碑意义的研究,以便更好地了解辐射暴露对宇航员的生理影响。利用英特尔的人工智能技
区块链技术分享起源1现下区块链大火,聊到相关话题,我们常常的反应年轻人怎么可能轻易认输呢?所以,我们打算写一系列文章揭开区块链的神秘面纱。提到区块链,常常会谈到一个高频词比特币。说到比特币,有个神秘的
12代酷睿战斗力顶梁柱ROGMAXIMUSZ690EXTREME登场在性能尚未解禁之前,玩家们对新一代酷睿的战斗力所有猜测,有许多是来自于ROGMAXIMUS平台运行时的曝光。无疑作为主板选择中的金字塔级产品,ROGMAXIMUS几乎坐稳了不可动摇
英特尔加速高性能计算技术创新以XPU架构引领E级计算时代2021CCF全国高性能计算学术年会(HPCChina2021)于今日正式拉开帷幕。此次会议期间,英特尔及其合作伙伴就如何通过高性能计算应对当今世界的重大挑战展开探讨,并展现了英特