Ich habe ein Array innerhalb des Solidity-Vertrags wie „ uint256[] public machineList; “ deklariert und die Werte dieses Arrays innerhalb des Konstruktors initialisiert.
Aber wenn ich dieses Array innerhalb von js usgin web3 wie unten erwähnt aufrufe:
AssetContract.deployed().then(function(contractInstance) {
let getMachineList = contractInstance.machineList;
alert(getMachineList);
});
Es gibt die folgende Ausgabe in der Variablen getMachineList zurück:
function () {
var instance = this
var args = Array.prototype.slice.call(arguments)
var tx_params = {}
var last_arg = args[args.length - 1]
if (Utils.is_object(last_arg) && !Utils.is_big_number(last_arg)) {
tx_params = args.pop()
}
tx_params = Utils.merge(C.class_defaults, tx_params)
return C.detectNetwork().then(function () {
return new Promise(function (accept, reject) {
var callback = function (error, result) {
if (error != null) {
reject(error)
} else {
accept(result)
}
}
args.push(tx_params, callback)
fn.apply(instance.contract, args)
})
})
}
diese Art von Daten, die ich bekommealert(contractInstance.machineList);
Wie können wir also Array-Werte in Side JS erhalten, ohne eine explizite Getter-Funktion innerhalb von Solidity zu erstellen, anstatt die eingebaute Getter-Funktion aufzurufen, die von Solidity für die Zustandsvariable bereitgestellt wird?
Sie können ein dynamisches Array wie folgt erhalten: uint256[] public machineList , indem Sie eine Contract-Getter-Funktion erstellen.
function getMachineList () external returns (uint256[]){
return machineList
}
Beachten Sie den externen Modifikator, den ich hinzugefügt habe. Bei dieser Art von Funktionen, bei denen Sie ein Array mit dynamischer Größe zurückgeben, ist der externe Modifikator obligatorisch. Es macht die Funktion auch nur von außerhalb des Vertrags aufrufbar, was genau das ist, was wir hier wollen.
Eine andere Sache ist, dass Sie Truffle verwenden, um Vertragsfunktionen aufzurufen. Wenn Sie Trüffel verwenden, müssen Sie nach dem Namen der Funktion ein Versprechen (oder einen Rückruf) aufrufen :
AssetContract.deployed().then(function (contractInstance) {
contractInstance.getMachineList.
call(**arguments if any**,{ from:**address**, gas: 300000 }).then(
data => {
var MachineList = data;
alert(MachineList);
}
)
})
Hinweis: Wenn Sie Trüffel verwenden, fügen Sie das hinzu .call()
, wenn Sie nur Funktionen aufrufen, die Variablen lesen und zurückgeben, als ob sie Zustandsvariablen nicht ändern würden (vorhandenen/neuen Wert ändern/hinzufügen).
Sie können nicht auf das gesamte Array zugreifen, ohne den Getter anzugeben. Sie können immer noch die eingebaute Funktion aufrufen, die von der public
Zustandsvariablen bereitgestellt wird, aber Sie müssen den Index des Arrays angeben, um seinen Wert zu erhalten.
In der Tat würde Ihr ABI für das bereitgestellte Array ungefähr so aussehen
{
"constant": true,
"inputs": [
{
"name": "",
"type": "uint256"
}
],
"name": "machineList",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
}
eine Eingabe wird erwartet und ist der Index des Elements des Arrays, das Sie lesen möchten.
Rija Soni
Rija Soni
Rija Soni
Kaki Meister der Zeit
Rija Soni
Rija Soni
Kaki Meister der Zeit
return
in Ihrem Code erwähnen.Rija Soni
Kaki Meister der Zeit
Rija Soni
Rija Soni