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

