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

ZeroEx库async/await与非异步函数使用问题求助

解决ZeroEx库async/await使用困惑及返回值问题

嘿,我完全理解你现在的困惑——ZeroEx全异步的API确实容易让人一开始摸不着头脑,咱们把这两个问题拆开来说清楚:

1. 异步调用会导致所有方法都必须异步吗?

其实不用太担心“连锁反应”的问题:

  • 只有直接调用异步函数的函数需要声明为async,那些只处理同步逻辑、不调用异步方法的函数完全可以保持同步。
  • 你可以把异步操作封装在单独的函数里,然后在顶层入口(比如main函数)统一处理异步流程,这样大部分业务逻辑还是能保持清晰的同步写法。
  • 举个例子:如果你有一个同步函数用来格式化拿到的订单数据,它不需要是async的,只要你在调用它之前已经通过await拿到了异步返回的结果就行。

2. 为什么getTopOfBook()无法给main()返回内容?

核心原因是:async函数返回的不是直接的结果,而是一个Promise对象。如果你的getTopOfBook是async函数,直接在同步的main里调用它,拿到的会是Promise,而不是你想要的字符串。

解决方法很简单,把main改成async函数,并用await来获取getTopOfBook的返回值:

// 假设你的getTopOfBook实现是这样的
async function getTopOfBook() {
  // 调用ZeroEx的异步API
  const orderBook = await zeroEx.orderbook.getOrderBookAsync('ETH', 'DAI');
  // 返回你需要的字符串
  return `买一价: ${orderBook.bids[0].price} | 卖一价: ${orderBook.asks[0].price}`;
}

// 把main改成async函数
async function main() {
  try {
    // 用await等待getTopOfBook的Promise resolve
    const topOfBookStr = await getTopOfBook();
    console.log('盘口数据:', topOfBookStr);
    // 这里可以继续用topOfBookStr做其他同步/异步操作
  } catch (err) {
    // 别忘了处理异步操作可能抛出的错误
    console.error('获取盘口数据失败:', err);
  }
}

// 顶层调用main,并处理可能的未捕获错误
main().catch(err => console.error('程序执行出错:', err));

额外提醒:

  • 如果你在不支持顶层await的环境(比如旧版Node.js),就用上面的方式调用async的main函数,并用.catch()处理错误。
  • 所有用await调用的异步操作,都建议放在try/catch里,避免出现未处理的Promise拒绝错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:00:42