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

无法在异步请求外部访问变量,async/await与Promise使用疑问

问题核心原因
  • 你使用的finnhubClient.quote是回调风格的异步接口,回调函数内的return语句只会将值返回给回调本身,无法传递到外层的getPrice函数
  • 没有将回调逻辑包装为Promise,即便getPrice被标记为async,它返回的Promise也没有关联到quote的异步结果,所以外层await拿到的始终是undefined
正确实现方案

首先把回调风格的quote调用手动包装为Promise,改写getPrice函数:

var price
const getPrice = async () => {
  // 获取当前市场价格
  var marketSymbol = checkOrders[i].symbol.split(" - ")[0].toUpperCase()
  console.log(checkOrders[i].symbol)
  // 手动将回调逻辑包装为Promise
  return new Promise((resolve, reject) => {
    finnhubClient.quote(marketSymbol, (error, data, response) => {  
      if (error) {
        // 异步请求出错时抛出错误
        return reject(error)
      }
      const currPrice = data.c
      console.log(currPrice);
      // 异步请求成功时返回目标数据
      resolve(currPrice)             
    });
  })
}

之后可以通过两种方式在外层拿到currPrice的值:

  1. 用then链式调用:
getPrice().then(price => {
  console.log(price)
  // 所有依赖price的业务逻辑都可以写在这里
})
  1. 用await调用:注意await只能在async函数内部使用,如果是在全局环境调用,需要包在自执行async函数里,或者开启JS顶层await支持
// 自执行async函数示例
;(async () => {
  price = await getPrice()
  console.log(price)
  // 所有依赖price的业务逻辑都可以写在这里
})()
额外注意

所有依赖currPrice的业务逻辑必须放在异步回调/then回调/await语句之后执行,不能写在异步逻辑的外层同步执行,否则会出现变量还没被赋值就被调用的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:09:03