Contract-Invocation
無法將契約狀態變數值分配給 javascript 變數
我想檢索契約狀態變數的值並將其分配給我的 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 開發人員來說是必不可少的,這與乙太坊或區塊鏈沒有直接關係。查看此文件以獲取詳細資訊。