Contract-Invocation

無法將契約狀態變數值分配給 javascript 變數

  • December 13, 2020

我想檢索契約狀態變數的值並將其分配給我的 javascript 變數。我按照該社區提供的指導方針進行操作,但未能分配。我的 javascript 程式碼在這裡 我正在使用 Node js。

const contractAddress1 = '0xc1847e91e386e11e4df447b3e333f1b18abd1aca'
const contractABI = [{"constant":true,"inputs":[],"................];
var contract1  = new web3.eth.Contract(contractABI, contractAddress1)
var ot="raw";
contract1.methods.getTotalSupply().call().then(function(result){

 console.log(result) 
 ot = result;
});
console.log("ot : ", ot);

它的輸出是:

ot :  raw
BigNumber { _hex: '0x2704' }

為什麼 ‘ot’ 仍然有值 ‘raw’ ,為什麼沒有 BigNumber { _hex: ‘0x2704’ } ???

這更像是一個 javascript 問題,而不是與乙太坊有關。你的變數ot沒有改變的原因是因為方法 contract1.methods.getTotalSupply() 需要一些時間來查詢區塊鏈的結果。這與 Ajax 請求的原理相同。你可以做的是使用 async/await 或者只是將變數放在查詢方法中。例子:

const contractAddress1 = '0xc1847e91e386e11e4df447b3e333f1b18abd1aca'
const contractABI = [{"constant":true,"inputs":[],"................];
var contract1 = new web3.eth.Contract(contractABI, contractAddress1)
var ot = "raw";
contract1.methods.getTotalSupply().call().then(function(result){
   console.log(result) 
   ot = result;
   console.log("ot : ", ot);
});

或者

const contractAddress1 = '0xc1847e91e386e11e4df447b3e333f1b18abd1aca'
const contractABI = [{"constant":true,"inputs":[],"................];
var contract1 = new web3.eth.Contract(contractABI, contractAddress1)
var ot = "raw";

async function init() {
   ot = await contract1.methods.getTotalSupply().call();
   console.log("ot : ", ot);
}
init();

ot在呼叫結果儲存到它之前,您正在列印。試試這個程式碼:

var ot="raw";
contract1.methods.getTotalSupply().call().then(function(result){
 console.log(result) 
 ot = result;
 console.log("ot : ", ot);
});

解釋:

您正在非同步呼叫合約,這意味著結果不是立即可用,而是在一段時間後可用。這就是為什麼您指定在結果可用時呼叫的回調函式。

ot但是,當結果尚不可用時,您正在嘗試立即列印。了解非同步執行對於當今的 JS 開發人員來說是必不可少的,這與乙太坊或區塊鏈沒有直接關係。查看此文件以獲取詳細資訊。

引用自:https://ethereum.stackexchange.com/questions/77250