call - 调用合约方法
调用合约的只读方法,并在EVM中直接执行方法,不需要发送任何交易。因此不会改变合约的状态。
调用:
myContract.methods.myMethod([param1[, param2[, ...]]]).call(options[, callback])
参数:
options
- Object : 选项,包含如下字段:from
- String (optional): The address the call “transaction” should be made from.- gasPrice - String (optional): The gas price in wei to use for this call “transaction”.
- gas - Number (optional): The maximum gas provided for this call “transaction” (gas limit).
callback
- Function : 可选的回调函数,其第二个参数为合约方法的执行结果,第一个参数为错误对象
返回值:
一个Promise对象,其解析值为合约方法的返回值,Mixed类型。如果合约方法返回多个值,则解析值为一个 对象。
示例代码:
// 使用回调函数接收合约方法执行结果
myContract.methods.myMethod(123).call({from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'}, function(error, result){
...
});
// 使用Promise接收合约方法执行结果
myContract.methods.myMethod(123).call({from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'})
.then(function(result){
...
});
下面合约中的方法返回多个值:
// Solidity
contract MyContract {
function myFunction() returns(uint256 myNumber, string myString) {
return (23456, "Hello!%");
}
}
那么在web3.js中,call
方法的返回值将是一个对象,即使用返回变量名作为键,
也使用索引作为键:
// web3.js
var MyContract = new web3.eth.contract(abi, address);
MyContract.methods.myFunction().call()
.then(console.log);
> Result {
myNumber: '23456',
myString: 'Hello!%',
0: '23456', // these are here as fallbacks if the name is not know or given
1: 'Hello!%'
}
下面合约中的方法返回单个值:
// Solidity
contract MyContract {
function myFunction() returns(string myString) {
return "Hello!%";
}
}
那么在web3.js中,call
方法也将返回单个值:
// web3.js
var MyContract = new web3.eth.contract(abi, address);
MyContract.methods.myFunction().call()
.then(console.log);
> "Hello!%"