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/