回调函数返回undefined?Promise未等待fetch结果的问题排查
问题出在异步操作的处理和Promise的返回上
让我帮你拆解一下问题所在:
核心问题1:fetch()函数没有返回Promise(甚至没有返回任何值)
你现在的fetch()函数里,调用了axios.get(),但没有把这个Promise链返回出去;而且parseString是异步回调,你在回调里return response完全不会被外部拿到。所以当你在get()里写resolve(this.fetch())时,this.fetch()其实返回的是undefined,这就是为什么successMessage打印出来是undefined。
核心问题2:异步回调没有被包装成Promise
parseString(看起来是xml2js的方法?)是基于回调的异步函数,你直接在它的回调里return值,外部根本捕获不到。我们需要把这个回调逻辑包装成Promise,才能让整个流程变成可链式调用的异步操作。
修正后的代码
我帮你重写了这两个函数,修复了这些问题:
// 重写fetch,让它返回一个Promise this.fetch = () => { // 首先返回axios.get的Promise链 return this.axios.get(this.URL).then((res) => { // 把parseString包装成Promise return new Promise((resolve, reject) => { this.parseString(res.data, (err, result) => { if (err) { // 如果解析出错,reject错误 return reject(err); } var response = []; // 遍历消息列表 for (var i=0; i<result.Messages[0].Message.length; i++) { var dateSent = result.Messages[0].Message[i].DateSent[0], to = result.Messages[0].Message[i].To[0], status = result.Messages[0].Message[i].Status[0], message = result.Messages[0].Message[i].Body[0], direction = result.Messages[0].Message[i].Direction[0], sid = result.Messages[0].Message[i].Sid[0]; var object = { 'To' : {N: to}, 'SID' : {S: sid}, 'Status' : {S: status}, 'Message' : {S: message}, 'DateSent' : {S: dateSent}, 'Direction' : {S: direction}, }; response.push(object); } // 解析完成,resolve最终的response数组 resolve(response); }); }); }); } this.get = () => { // 直接用fetch返回的Promise,不需要再包装一层新Promise this.fetch().then((successMessage) => { console.log(successMessage); // 现在这里会拿到正确的response数组 }).catch((err) => { // 别忘了处理错误! console.error('获取或解析数据出错:', err); }); }
关键修改点解释
- 让
fetch()返回Promise:在axios.get()前面加了return,这样整个fetch()函数会返回一个Promise,后续可以用.then()等待它完成。 - 包装
parseString为Promise:把parseString的回调逻辑放进一个新的Promise里,解析成功就resolve(response),出错就reject(err),这样就能把回调式的异步操作转化为Promise链式操作。 - 简化
get()函数:不需要再手动创建myFirstPromise,直接调用this.fetch()就能得到Promise,然后链式调用.then()和.catch()即可。 - 增加错误处理:添加了
.catch()来捕获整个流程中可能出现的错误(比如网络请求失败、XML解析错误),这是异步操作中很重要的一环。
另外,如果你的parseString支持Promise版本(比如xml2js的parseStringPromise),还可以进一步简化代码,去掉手动包装的Promise,让代码更简洁。
内容的提问来源于stack exchange,提问作者richardthefourth
相关产品推荐
相关产品推荐

