为什么封装的request的get必须放在await后面,返回的才是数据

为什么封装的request的get必须放在await后面,返回的才是数据

https://img1.sycdn.imooc.com//climg/6412cf06094688e710880882.jpg截图中的get前少了一个await,结果输出的result就只是一个promise对象,如果get前加上await返回的才是借口数据。这是啥原理?

https://img1.sycdn.imooc.com//climg/6412cfa30921168618820384.jpg

相关代码:

import axios from 'axios'

const instance = axios.create({
baseURL: 'https://www.fastmock.site/mock/ae8e9031947a302fed5f92425995aa19/jd',
timeout: 10000
})

export const post = (url, data = {}) => {
return new Promise((resolve, reject) => {
instance.post(url, data, {
headers: {
'Content-Type': 'application/json'
}
}).then((response) => {
resolve(response.data)
}, err => {
reject(err)
})
})
}

export const get = (url, params = {}) => {
return new Promise((resolve, reject) => {
instance.get(url, { params }).then((response) => {
resolve(response.data)
}, err => {
reject(err)
})
})
}


正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好,这是ES6的async、await关键字的作用。以如下代码为例(项目代码的简化版),给同学解释一下:

// 使用Promise,异步返回数据
    function get() {
      return new Promise(resolve => {
        resolve('我是具体数据')
      })
    }

    const getData = async () => {
      // await等待get方法执行完,并拿到结果
      const data = await get()

      // 这里才会执行
      console.log(data)
    }
    getData()

1、async、await要一起使用,await要写在async中,比如:

https://img1.sycdn.imooc.com//climg/6412d1e009fc4bb105150132.jpg

2、await是等待的意思,它会等待后面的异步方法执行完毕、拿到结果后,再让代码往下继续执行。比如当await后面的方法,返回的是Promise对象时,使用await就会直接拿到Promise中的数据:

https://img1.sycdn.imooc.com//climg/6412d2a60908990906240455.jpg

这是二者底层逻辑实现的,关注结果本身就行。

3、当不写await时,get方法是异步的,并且get本身就是Promise对象,所以data肯定是一个Promise对象:

https://img1.sycdn.imooc.com//climg/6412d33b097926ce06060205.jpg

4、如下课程中,细致的讲解过二者的作用:

https://img1.sycdn.imooc.com//climg/6412d35e09cb54b205410560.jpg

建议同学回顾一下,这样会理解的更深。

祝学习愉快!

  • 慕粉1234567890123 提问者 #1

    你看我理解的对不对:

    如果不加await,那么在get的promise执行结果出来之前就会把promise对象直接赋值给result;加了wait之后,就会等待get的promise执行结束拿到数据,才会执行result的赋值。


    如果是这样的话,为啥这里的item的结果也是promise对象?

    https://img1.sycdn.imooc.com//climg/6412d5040917f4d511520674.jpg


    2023-03-16 16:39:36
  • 解答如下:

    1、如下理解是对的:

    https://img1.sycdn.imooc.com//climg/6412d9850943656407640061.jpg

    2、注意,截图中的写法,item是接收getData的返回值。而getData是async函数,async函数本身是异步的,所以会得到一个promise对象:

    https://img1.sycdn.imooc.com//climg/6412d9e209af49be06340363.jpg

    getData和get方法的调用方式是不一样的,getData()前面没用await修饰。

    2023-03-16 16:58:56
  • 为了让a能获得promise执行后的结果,那是不是还得在getData外面再包装一个async/await函数?

    视频中老师用reactive来声明a,是不是就是为了解决这个问题?

    2023-03-16 17:06:30
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师