Vue 数据同步获取

问题场景

vue中,我们像后台请求数据时,使用的是axios,由于请求是需要花费时间的的,而且这个时间还不少(http请求消耗的时间比较长),所以axios发起请求后会立马返回一个Promise对象,然后往下执行js语句。

在Promise对象中进行http请求,请求成功后在.then(callback)中能够拿到请求结果。

let user
console.log('请求前的代码')
this.$http.post('/api/user/get', {Id: '00001'}).then((res) => {
    user = res
    console.log('请求结果:' + res)
})
console.log('请求后的代码,请求结果:' + user)

以上代码,假设获取用户信息需要1s,远大于其他js代码的执行时间,那么最终输出顺序是什么?

请求前的代码
请求后的代码,请求结果:undefined
请求结果:{"Id": "00001", .... }

没错,程序会先执行js代码,而变量赋值在请求成功后,所以我们无法保证在请求外能够拿到请求结果。这是异步非常容易产生的问题。

如果我们的业务逻辑需要请求多个数据,并且后一个请求依赖于前一个请求的结果,这时候我们更不能保证数据获取顺序,因此我们需要将异步请求改成同步,以保证业务逻辑的正确性。

async 与 await

async 意为:异步的,其放在我们所定义的function名前,如:

async getUser() {}

其声明这个函数为一个异步执行的,也就是说 我们调用这个方法时,其返回就是一个Promise对象,显然axios的请求方法,就是通过这个关键字来实现异步的。他的好处就是让程序快速执行,避免用户等待页面加载的时间过长,当然现在我们不想讨论他的优点,他的缺点就是我们现在遇到的问题,我们想要拿到数据再执行下一行代码。

await 意为等待,显然 异步执行的方法,能够通过这个关键字,等待请求结果,实现将异步执行的方法变成同步的。

好了,问题解决,只要在请求时加上await就可以了!

console.log('请求前的代码')
let user = await this.$http.post('/api/user/get', {Id: '00001'})
console.log('请求后的代码,请求结果:' + user)

结果输出:

请求前的代码
请求后的代码,请求结果:{"Id": "00001", .... }

是的,结果确实是正确的,但还有一个规则还没有讲,那就是 async 与 await 必须同时出现 所以我们的代码实际是这样:

asycn getUser() {
    // ... 其他代码
    console.log('请求前的代码')
    let user = await this.$http.post('/api/user/get', {Id: '00001'})
    console.log('请求后的代码,请求结果:' + user)
    // ... 其他代码
}

如果有多个请求需要同步:

asycn getUser() {
    // ... 其他代码
    console.log('请求前的代码')
    let user1 = await this.$http.post('/api/user/get', {Id: '00001'})
    console.log('请求后的代码,请求结果:' + user1)
    let user2 = await this.$http.post('/api/user/get', {Id: '00002'})
    console.log('请求后的代码,请求结果:' + user2)
    let user3 = await this.$http.post('/api/user/get', {Id: '00003'})
    console.log('请求后的代码,请求结果:' + user3)
    // ... 其他代码
    
    return [user1, user2, user3] // 假设返回一个数组
}

如果还要嵌套一层

asycn getUser(){
    ...
},
async getDep(users) {
    let dep1 = await this.$http.post('/api/dep/get', {Id: users[0].DepId})
    let dep2 = await this.$http.post('/api/dep/get', {Id: users[1].DepId})
    let dep3 = await this.$http.post('/api/dep/get', {Id: users[2].DepId})
    return [dep1, dep2, dep3]
},
async getData() {
    let users = await getUser()
    let deps = await getDep(users)
    // ... 其他代码
}

Vue中使用

vue项目中,需要使用到同步的,通常也只有页面渲染时的数据初始化。

我们可以定义一个异步方法,将需要同步的请求都放到其中执行

export default {
    mouted () {
        this.initData()  
    },
    methods: {
        async initData() {
            let users = await getUsers()
            await getDeps(users)
        },
        async getUsers() {
            ...
        },
        async getDeps(user) {
            ...
        },
            
        // ...
    }
}

钩子mouted由于不能使用await,所以需要定义一个异步的initData()方法进行数据的初始化。

我可能啥都不会,希望朋友点评......

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,607评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,239评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,960评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,750评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,764评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,604评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,347评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,253评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,702评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,893评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,015评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,734评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,352评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,934评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,052评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,216评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,969评论 2 355

推荐阅读更多精彩内容