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

JavaScript使用async/await执行异步代码无法获取返回值问题求解

问题原因

  • 你使用的request是回调风格的异步API,await仅能对返回Promise的函数生效,当前createObject没有返回Promise,代码执行不会等待HTTP请求完成就会直接往下走
  • 你在调用request后立刻同步读取res.body.id,此时HTTP请求还未完成,回调函数尚未触发,res中没有返回的响应数据,所以拿到的是undefined

修复方案

将createObject改造为返回Promise的函数,把HTTP请求的结果放到回调中通过Promise抛出,改造后的代码如下:

// 改造createObject返回Promise
function createObject() {
  return new Promise((resolve, reject) => {
    try {
      console.log("Processing POST Loan.");

      const data = {
        "value1": 1288,
        "value2": [{
          "value3": 3833,
          "value4": [{
            "value5": new Date()
          }]
        }]
      }
      const auth = Buffer.from("login:pass").toString('base64')
      request("http://url.com/resource", {
        method: "POST",
        headers: {
          'Content-Type': 'application/json',
          'Authorization': "Basic " + auth
        },
        body: JSON.stringify(data)
      }, function (error, response, body) {
        // 回调里处理返回结果
        if (error) {
          reject(error)
          return
        }
        // 注意body是字符串,要先转成JSON对象
        const resBody = JSON.parse(body)
        resolve(resBody.id)
      })
    } catch (err) {
      reject(err)
    }
  })
}

async function uploadReport() {
  try {
    console.log('create object')
    const objectId = await createObject();
    console.log('object = ' + objectId)
  } catch (err) {
    // 统一处理错误
    console.error('请求出错:', err)
  }
}

uploadReport()

补充说明

如果项目允许升级依赖,更推荐使用原生fetch或者axios这类默认支持Promise的HTTP请求库,无需手动包装回调,代码会更简洁。

内容的提问来源于stack exchange,提问作者J. Doe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 03:36:00