V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
s609926202
V2EX  ›  问与答

async/await 如何直接获取返回值并赋值给一个参数?

  •  
  •   s609926202 · 2018-04-13 01:10:55 +08:00 · 12050 次点击
    这是一个创建于 2442 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近开发小程序,需要用到 async/await 功能,如下(类似 vue.js 单页面开发):

    export default class Index extends wepy.page {
        data = {
          ecAccessCount: {
            option: this.getAccessCountOption().then((res) => {
              // 问题在这里,getAccessCountOption()返回的是一个 promise 对象,该如何直接获取该对象里包含的值并赋值给 option 呢?因为 option 的值是一个{}对象。
              return res
            })
          }
        }
        
        async getAccessCountOption() {
          // 这里我创建两个对象,并在下面的 await 中通过 api 获取并处理得到的值,因为在 return 回的对象中需要用到这两个动态的值。
          let dataX = []
          let dataY = []
    
          await wepy.request({
            url: api.user.accessCount.url,
            method: api.user.accessCount.method
          }).then((res) => {
            res.data.data.map(function (item, index, array) {
              dataX.push(item.dimensions[0])
              dataY.push(item.metrics[0].values[0])
            })
          })
          
          return {
            legend: {
              data: ['会话数']
            },
            grid: {
              left: '0',
              right: '0',
              bottom: '2%',
              containLabel: true
            },
            xAxis: {
              type: 'category',
              data: dataX
            },
            yAxis: {
              type: 'value'
            },
            series: [
              {
                name: '会话数',
                data: dataY,
                type: 'line'
              }
            ]
          }
        }
    }
    

    上面就是遇到的问题,,getAccessCountOption()返回的是一个 promise 对象,该如何直接获取该对象里包含的值并赋值给 option 呢? option 接受一个对象作为参数。

    7 条回复    2018-04-13 14:01:28 +08:00
    Exin
        1
    Exin  
       2018-04-13 01:25:03 +08:00
    ```js
    option: await this.getAccessCountOption()
    ```

    这种问题搜一下 async/await 的基本用法就应该了然了,楼主误用了什么关键词?
    zhoufenfens
        2
    zhoufenfens  
       2018-04-13 01:46:21 +08:00
    既然你知道 getAccessCountOption 返回一个 promise,那就在外面再包一层 async 呗,await 独立使用确实会报 'await is a reserved word'的错误。
    ecAccessCount: {
    option:
    (async function getACO() {
    return this.getAccessCountOption().then((res) => {
    return res
    });
    })()
    }
    zhoufenfens
        3
    zhoufenfens  
       2018-04-13 01:47:04 +08:00
    排版不太好,但这个确实是可行的
    grantonzhuang
        4
    grantonzhuang  
       2018-04-13 07:57:11 +08:00 via Android
    @zhoufenfens 第一个 return 后面加一个 await,后面的 then 那些都可以不要了
    DOLLOR
        5
    DOLLOR  
       2018-04-13 10:18:51 +08:00
    @zhoufenfens 这样做,option 仍然是一个 promise 对象。而且 this 已经指歪了……
    s609926202
        6
    s609926202  
    OP
       2018-04-13 10:40:50 +08:00
    @Exin 你这样子写肯定不行的吧,,await 是要和 async 一起用的,,
    Exin
        7
    Exin  
       2018-04-13 14:01:28 +08:00 via iPhone
    @s609926202 噢,看漏了

    你再把这个包进一个函数,然后在 constructor 里调用
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3380 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 11:50 · PVG 19:50 · LAX 03:50 · JFK 06:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.