vue计算函数return ajax,vue 通过请求获取数据return回来,不好使

哈哈,好问题;大部分初学者都是犯这个错误;

你的代码里面其实有2个东西需要解释:

如何进行异步编程, 这个太大;其实你这里需要搞清楚 Promise

一个场景的问题: 同一个方法,即包含同步代码又包含异步代码 这个方法如何封装

第一个问题:

会想下,在没有 promise这样的语法的时候,我们怎么处理异步编程的? 答案是 回调函数,示例如下(用setTimeout 模拟异步)

function a(){

setTimeout(()=>{

/** 业务员代码 **

return '123'

},1000)

}

这个时候使用 a 函数的时候,你无法通过 let data = a() 得到任何值;因为 return 的语句执行在异步里面;可以理解为 let data = a() 这个先被执行完毕了之后,才会执行 return; 所以需要通过回调解决

function a(func){

setTimeout(()=>{

if(typeof func === 'function'){

func('123') // 这个时候就把123 这个结果给到了回调函数

}

},1000)

}

// 调用的地方

a(function(data){

console.log(data) ;// 这个时候输出 123

})

ok,

那么,通过 Promise如果实现

function a(){

return new Promise((resolve,reject)=>{

setTimeout(()=>{

resolve('123')

},1000)

})

}

// 调用的地方

a()

.then(data=>{

console.log(data);// 可以得到123

})

// 或者下面

let data = await a(); // 注意这段代码只能放在 `async`体内才能执行

所以:你的代码中 直接通过 return 不能拿到值

再说第二个问题: 这个场景很常见,就是如果本地缓有数据我就取本地缓存(这是同步),如果没有为就通过API获取(这是异步)

这种场景,为工作中常用的做法,就是把函数本身封装成 Promise;不管是同步还是异步都通过 异步去处理; 当然这里也推荐 使用 rxjs 解决问题; 因此你的代码改造如下

async created () {

this.sydLb = await this.getEnumTypeDict({ parentcode: '01' })

this.sydJb = await this.getEnumTypeDict({ parentcode: '04' })

},

methods: {

getEnumTypeDict (params) {

let data = window.localStorage.getItem(`sydJb${params.parentcode}`); // 这里提出来,只是方便使用,和问题本身没关系

return new Promise((resolve,reject)=>{

if (data) {

resolve(JSON.parse(data))

}else{

api.getEnumTypeDict(params)

.then(res => {

if (res.status === 200 && res.data.code) {

setLocalStorage(`sydJb${params.parentcode}`, res.data.data.data);

resolve(res.data.data.data)

}else{

reject(new Error('这里写你自己的异常信息'))

}

}).catch(error => {

reject(new Error(error.message || '这里写你自己的异常信息'))

})

}

})

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值