You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

回调函数返回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);
  });
}

关键修改点解释

  1. 让fetch()返回Promise:在axios.get()前面加了return,这样整个fetch()函数会返回一个Promise,后续可以用.then()等待它完成。
  2. 包装parseString为Promise:把parseString的回调逻辑放进一个新的Promise里,解析成功就resolve(response),出错就reject(err),这样就能把回调式的异步操作转化为Promise链式操作。
  3. 简化get()函数:不需要再手动创建myFirstPromise,直接调用this.fetch()就能得到Promise,然后链式调用.then()和.catch()即可。
  4. 增加错误处理:添加了.catch()来捕获整个流程中可能出现的错误(比如网络请求失败、XML解析错误),这是异步操作中很重要的一环。

另外,如果你的parseString支持Promise版本(比如xml2js的parseStringPromise),还可以进一步简化代码,去掉手动包装的Promise,让代码更简洁。

内容的提问来源于stack exchange,提问作者richardthefourth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:06:29