async 和 await

async 和 await

1、async函数

异步函数声明声明一个async function,其中函数体中允许使用 await 关键字。async 和 await 关键字允许以更简洁的样式编写异步、基于 promise 的行为,从而避免了显式配置承诺链的需要。

2、Promise

Promise 对象表示异步操作的最终完成(或失败)及其结果值。Promise拥有自己的state

2-1、Promise的state

pending: initial state, neither fulfilled nor rejected.

fulfilled: meaning that the operation was completed successfully.

rejected: meaning that the operation failed.

2-2、Promise的工作流程

pending状态中如果执行被reject,那么Promise进入rejected状态,并调用.catch函数,如果执行成功,则进入fulfilled状态,并调用.then函数

3、与Taro.request结合

由于Taro.request返回的是一个Promise,如果直接将其输出,将会得到在pending状态的Promise,而不是希望得到的结果。这个时候,使用async函数,并使用await等待Promise执行完毕,则可获得.then函数中期望的返回值

async function InfoData() {
    const info = await Request('post','/project/games/find',Token,{
        "crowd": `${crowdList[state.list[2]]}`,
        'time':`${timeList[state.list[1]]}`,
        "venue": `${placeList[state.list[0]]}`,
      })
      setgameL(info.data.data)
      console.log('info',info.data.data);
      return info.data.data;
  }

在上面的例子中,Request是封装好的请求函数,.then回调返回拿到的数据,如果直接使

info = Request('post','/project/games/find',Token,{
            "crowd": `${crowdList[state.list[2]]}`,
            'time':`${timeList[state.list[1]]}`,
            "venue": `${placeList[state.list[0]]}`,
       })

则会得到:Promise<pending...>这个结果

4、问题

在下面的程序中,调用.then函数可以正常对dataList赋值,但是如果使用Taro.request自带的success回调则不能正常赋值

 dataList = await Taro.request({
          url: 'http://116.204.121.9:65000/api/v1'+url, 
          method: method,
          header: {
            'Authorization': Token?Token:'',
            'Content-Type': 'application/json',
            'Accept': '*/*',
          },
          data: JSON.stringify(body),
          
        }).then((res) => {
          if(url === '/login' ) {
            if(res.statusCode !== 401) {
              Taro.setStorageSync('token',res.data.data.Token)
              dataList = [res.data.data]
            } else {
              register()
            }    
           } else {
            // console.log('iiiiiiiiiiiiiiiiiiiiiii',res);
            res.data.data.qq?Taro.setStorageSync('nickName',res.data.data.qq):''
            res.data.data.qq?Taro.setStorageSync('url',res.data.data.photo):""
            // res.data.data.qq?Taro.setStorageSync('uid',res.data.data.uid):''
            return res
           }
          
        })

async 和 await
http://baidu.com/2023/07/10/async/
作者
KB
发布于
2023年7月10日
许可协议