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

使用Web3.js调用Solidity智能合约如何正确获取方法返回值

问题解答

响应是否符合预期

该响应完全符合预期。你打印的对象是Promise实例,web3.js所有和区块链节点交互的方法都是异步实现,不会同步返回执行结果,直接打印只能看到Promise的状态、内置属性等元数据,看不到实际的合约返回值。

如何获取返回值

有两种常用的异步结果获取方式:

方式1:使用async/await语法(更推荐,代码可读性更高)

把调用逻辑封装到异步函数中,用await关键字等待Promise执行完成,就能直接拿到返回值:

const web3 = new Web3("http://localhost:8545");
const contractAddress = "0x4E265652f963548b8A8e6452575B3009538b858f";
const abiArray = [{"inputs":[],"name":"testFunc","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"}];
const contract = new web3.eth.Contract(abiArray, contractAddress);

// 封装异步调用函数
async function getTestFuncResult() {
  try {
    const result = await contract.methods.testFunc().call();
    console.log("合约返回值:", result); // 输出 Hello World!
  } catch (err) {
    console.error("调用合约出错:", err);
  }
}
getTestFuncResult();

方式2:使用.then()回调

通过Promise的.then方法监听执行完成的回调,在回调中拿到返回值:

contract.methods.testFunc().call()
.then(result => {
  console.log("合约返回值:", result); // 输出 Hello World!
})
.catch(err => {
  console.error("调用合约出错:", err);
});

补充注意事项

  • 调用pure、view类型的只读方法时必须加.call(),如果不加只是创建了方法调用实例,不会实际发起节点请求,也拿不到返回值。
  • 如果是调用会修改链上状态的非只读方法,需要用.send({from: 调用地址})代替.call(),返回的是交易相关的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 22:06:04