AWS API Gateway客户端未执行.then,直接退出apigClient函数
问题分析与解决方案
咱们直接拆解你遇到的核心问题,一步步来解决:
1. apiCall函数未返回异步Promise
你调用的apigClient.invokeApi()是异步操作,返回的是一个Promise,但你没有把这个Promise返回给调用者。这就导致外部调用apiCall()时拿到的是undefined,自然无法进入.then回调处理结果。
修复apiCall函数
给apigClient.invokeApi()的调用加上return,同时完善错误处理(别空着catch,方便排查问题):
const apiCall = function(searchInput) { const searchTerm = searchInput; var apigClientFactory = require('aws-api-gateway-client').default; const config = { apiKey: 'xxxxxx', invokeUrl:'https://xxxx.execute-api.us-east-2.amazonaws.com' }; var apigClient = apigClientFactory.newClient(config); var params = { search_keyword: 'Ambassador' }; var pathTemplate = '/beta/testDB'; var method = 'GET'; var additionalParams = { headers: { }, queryParams: { search_keyword: 'Ambassador' } }; // 关键:返回Promise,让外部能链式处理异步结果 return apigClient.invokeApi(params, pathTemplate, method, additionalParams) .then(function(result) { console.log('API返回数据:', result); return JSON.parse(result.data); }).catch( function(error){ console.error('API调用失败:', error); throw error; // 抛出错误,让外部也能捕获处理 }); }
2. 组件内的调用方式错误
异步操作不能直接同步赋值给state——apiCall()返回的是Promise,不是即时数据。你需要等待Promise完成后,再更新状态。
修复componentDidMount的调用逻辑
推荐两种写法,选你习惯的就行:
写法一:链式.then
componentDidMount (){ apiCall(this.state.testSearch) .then(data => { this.setState({ apiData: data }); this.updateAPIdata(); // 确保数据更新后再执行这个方法 }) .catch(error => { console.error('获取API数据失败:', error); }); }
写法二:async/await(更简洁直观)
async componentDidMount (){ try { const data = await apiCall(this.state.testSearch); this.setState({ apiData: data }); this.updateAPIdata(); } catch (error) { console.error('获取API数据失败:', error); } }
额外小提醒
你代码里的params和additionalParams都硬编码了search_keyword: 'Ambassador',没有用到传入的searchInput参数,如果这不是你的本意,可以改成search_keyword: searchInput哦。
内容的提问来源于stack exchange,提问作者Stephen Lester
相关产品推荐
相关产品推荐

