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

Node.js终端执行异步代码返回Promise时如何等待获取实际值

原因

你输入node进入的是Node.js的交互式运行环境(REPL),它的默认逻辑是对输入的表达式求值完成就立刻返回结果。你粘贴的那段代码是个立即执行的async函数,本身的返回值就是Promise对象,REPL不会自动等待这个Promise异步执行完成再输出,所以回车后会先看到返回的Promise,拿不到异步操作跑完的实际值。
而把代码写进js文件用node file.js执行时,Node进程会等事件循环里的所有异步任务都执行完才退出,异步操作的结果也能正常打印,所以不会出现这个问题。

解决方法
  • 直接用REPL自带的顶层await支持
    目前所有还在维护的Node.js版本,REPL环境默认支持顶层await,你完全不需要套一层async立即执行函数,直接写带await的代码就行,REPL会自动等待异步操作执行完再返回结果:
    const solanaWeb3 = require('@solana/web3.js');
    const connection = new solanaWeb3.Connection(solanaWeb3.clusterApiUrl('devnet'));
    const blockHeight = await connection.getBlockHeight();
    console.log(blockHeight);
    
    粘贴后回车,会等Solana节点接口返回数据后,直接打印出最新的区块高度。
  • 给原代码返回的Promise加回调打印结果
    如果你不想修改原来的代码结构,只要在立即执行函数的后面加个.then(console.log)就行,等Promise状态变为完成后,会自动把结果传到console.log打印出来:
    (async ()=> {
      var solanaWeb3 = require('@solana/web3.js');
      let connection = new solanaWeb3.Connection(solanaWeb3.clusterApiUrl('devnet'));
      let data = await connection.getBlockHeight();
      return data
    })().then(console.log)
    
  • 把Promise存为变量后续调试取值
    如果你需要保留结果做后续调试,可以先把异步函数返回的Promise赋值给一个临时变量,等接口请求完成后,再用await取出实际值:
    // 先执行这段代码
    const heightPromise = (async ()=> {
      var solanaWeb3 = require('@solana/web3.js');
      let connection = new solanaWeb3.Connection(solanaWeb3.clusterApiUrl('devnet'));
      let data = await connection.getBlockHeight();
      return data
    })()
    
    等1~2秒请求完成后,直接在终端输入await heightPromise就能拿到实际的区块高度数值。

内容的提问来源于stack exchange,提问作者Rusty Pythonic Script

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 19:51:45