调用另一函数内的异步方法后返回值始终为undefined怎么解决?
问题诱因
- 异步操作时序不匹配:
fetchData属于异步网络请求,其.then()回调会在请求完成后才执行,而作为普通同步函数的repeatsChecker不会等待异步请求完成,会直接返回刚初始化的空数组api_data_values。 await关键字仅对Promise类型生效:repeatsChecker默认返回普通数组,await不会做任何等待处理,直接返回空数组,因此访问test[0]得到undefined,依赖数组内容的判断逻辑也全部不符合预期。
解决方法
将repeatsChecker改造为异步函数,等待fetchData请求完成并处理完数据后再返回结果,可选两种写法:
- async/await写法(更易读)
async function repeatsChecker() { let api_data_values = [] // 等待异步请求返回结果后再执行后续逻辑 const data = await fetchData() for (let i = 0; i < data.length; i++) { api_data_values.push(data[i].name) } return api_data_values } // 测试代码无需改动 async function test() { let name = "Joe" let test = await repeatsChecker(); console.log(test[0]) } test()
- 链式Promise写法
function repeatsChecker() { // 直接返回Promise对象,让外部await可以等待数据处理完成 return fetchData().then(data => { const api_data_values = [] for (let i = 0; i < data.length; i++) { api_data_values.push(data[i].name) } return api_data_values }) }
两种写法都可以保证await repeatsChecker()返回的是填充完成的数组,不会出现undefined问题。
内容的提问来源于stack exchange,提问作者coding_begins
相关产品推荐
相关产品推荐

