React Native中async await报错‘await对该表达式无效果’如何解决?
报错原因
'await' has no effect on the type of this expression.ts 是TypeScript的类型提示,说明你await的loginUser函数没有返回Promise类型,await对普通返回值的函数没有作用。
解决步骤
- 第一步:修改
loginUser函数,明确返回Promise
你需要把loginUser改为async函数,确保内部的接口请求、AsyncStorage存储操作都被await处理,所有异步逻辑执行完成后再resolve,示例写法如下:
import AsyncStorage from '@react-native-async-storage/async-storage'; import axios from 'axios'; // 显式标注返回值为Promise,让TS明确识别类型 export const loginUser = async ( userName: string, password: string, setShowLoader: (status: boolean) => void ): Promise<void> => { setShowLoader(true); try { // 等待接口请求完成 const loginRes = await axios.post('/你的登录接口地址', { userName, password }); // 等待用户信息存储到AsyncStorage完成 await AsyncStorage.setItem('userInfo', JSON.stringify(loginRes.data)); } catch (err) { // 抛出错误让上层catch捕获 throw new Error(err instanceof Error ? err.message : '登录失败'); } finally { setShowLoader(false); } }
- 第二步:检查
loginHandle的写法
你当前的loginHandle是高阶函数写法,返回的是另一个async函数,如果是绑定到按钮点击事件上,需要注意调用方式是否正确,避免逻辑不执行。另外如果signIn函数内部也包含读取AsyncStorage的异步操作,建议也加上await确保逻辑顺序正确:
const loginHandle = async(userName:string,password:string) => async() => { // 注意补全你前面漏写的if判断逻辑 if(/* 你的校验逻辑,比如账号密码非空判断 */){ // 你的校验不通过逻辑 }else{ try { // 此时loginUser已返回Promise,await生效 await loginUser(userName, password, setShowLoader); // 如果signIn是异步函数,也建议加await await signIn(userName,password); }catch (error) { console.log(error instanceof Error ? error.message : '未知错误') } } }
- 第三步:可选类型补充
如果修改后仍有提示,可以在导入loginUser的地方手动确认导入路径是否正确,避免导入了错误的普通函数版本。
内容的提问来源于stack exchange,提问作者Guilherme Cavenaghi
相关产品推荐
相关产品推荐

