调用async函数getAllCams返回Promise而非预期数组,求排查原因
问题分析与解决方案
核心原因:Async函数的本质
你遇到的问题其实是对async函数的基础特性理解有偏差——所有async函数的返回值都会被自动包装成Promise对象,不管你在函数内部用了多少个await。哪怕你在getAllCams里return的是newData或者ApiService.FAILURE,这些值都会被包裹成Promise.resolve(newData)或Promise.resolve(ApiService.FAILURE)。
所以你直接调用const listOfCams = apiService.getAllCams();时,得到的必然是Promise,而不是最终的结果值。
两种正确获取结果的方式
方式一:在componentWillMount中使用async/await
你可以把componentWillMount改成async函数(注:React官方现在更推荐用componentDidMount,但针对你当前的代码场景可以这么改),然后用await来获取async函数的最终结果:
async componentWillMount() { loggingService.debug('component will mount'); try { const listOfCams = await apiService.getAllCams(); loggingService.debug('here is your data', listOfCams); // 这里可以处理listOfCams的数据,比如更新组件state } catch (e) { loggingService.debug('Failed to get cams list', e); } }
方式二:使用.then()链式调用
如果你之前用.then()没成功,大概率是写法有误,正确的写法应该是:
componentWillMount() { loggingService.debug('component will mount'); apiService.getAllCams() .then(listOfCams => { loggingService.debug('here is your data', listOfCams); // 处理数据逻辑 }) .catch(e => { loggingService.debug('Failed to get cams list', e); }); }
额外优化:修复getAllCams的catch块
你的getAllCams函数里的catch块没有返回任何值,这会导致如果请求抛出错误时,函数会返回一个resolved状态的Promise(值为undefined),而不是你预期的ApiService.FAILURE。建议修改catch块:
async getAllCams() { try { const getAlarmListRes = await fetch(`someurl`, { method: 'GET', headers: new Headers({ Authorization: `Basic ${base64.encode('user-id:1234')}`, 'Content-Type': 'application/json' }) }); if (getAlarmListRes.status === 200) { const newData = await getAlarmListRes.json(); if (newData !== '') { loggingService.debug('here is your array', newData.alarms); return newData; } return ApiService.FAILURE; } loggingService.debug('Was not able to get alarm list for you', getAlarmListRes); return ApiService.FAILURE; } catch (e) { loggingService.debug('could not get alarm list', e); // 加上这行,确保出错时返回预期的FAILURE return ApiService.FAILURE; } }
内容的提问来源于stack exchange,提问作者VK1
相关产品推荐
相关产品推荐

