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
相关产品推荐
相关产品推荐

