Web3js

使用 Web3.js,我如何在合約的多個實例上呼叫一個函式,然後將它們的結果儲存在一個數組中?

  • March 16, 2022

使用 Web3.js,我如何在合約的多個實例上呼叫一個函式,然後將它們的結果儲存在一個數組中?我試過 .map 和 .forEach,但它們沒有返回我期望的對象。

當我在一個實例上呼叫該函式時,我能夠獲得理想的結果:

let giftStats = await SmartGift(
       '0xbb6810057e1D82deE83A981b002F2E0C60293a27'
   )
       .methods.getGiftStats()
       .call()



console.log(giftStats)

Result { '0': '0xfAA7541C5cBe22E4518736D2b5fC34D07347eE45', '1': '0x0000000000000000000000000000000000000000', '2': '0x0000000000000000000000000000000000000000', '3': '0', '4': '0', '5': '0', '6': '100', '7': '0', '8': false, '9': false, '10': '' }

我正在尋找一種方法,使我能夠將兩個像上面的對像一樣儲存在一個數組中。但是當我嘗試在地址數組上呼叫 map() 或 forEach() 時,結果數組不是我所期望的。

嘗試 1:.map()

const recipientGifts = ['0xAEaadCd9499127Ae0826aC2E918372927E4B55D4','0xbb6810057e1D82deE83A981b002F2E0C60293a27']    
let giftStats = await recipientGifts.map((address) => {
JSON.stringify(
   SmartGift(address)
   .methods.getGiftStats()
   .call()
)
console.log(giftStats)  

$$ undefined, undefined $$

嘗試 2:.forEach()

const recipientGifts = ['0xAEaadCd9499127Ae0826aC2E918372927E4B55D4','0xbb6810057e1D82deE83A981b002F2E0C60293a27']  
let giftStats = []
await recipientGifts.forEach((address) =>giftStats.push(SmartGift(address)  
   .methods.getGiftStats() 
   .call() ))

console.log (giftStats)

[ Promise { _bitField: 0, _fulfillmentHandler0: undefined, _rejectionHandler0: undefined, _promise0: undefined, _receiver0: undefined }, Promise { _bitField: 0, _fulfillmentHandler0: undefined, _rejectionHandler0: undefined, _promise0: undefined, _receiver0: undefined } ]

第二種方法非常接近,但您應該嘗試將 await 放在 forEach 中,因為這會返回一個承諾

await recipientGifts.forEach(async(address) => giftStats.push(await SmartGift(address) 
.methods.getGiftStats()
。稱呼() ))

我最初想只使用函式式程式來解決這個問題,避免循環。但我讓它使用for循環工作。

let giftStats = []
   for (let i = 0; i < recipientGifts.length; i++) {
       giftStats.push(
           await SmartGift(
               recipientGifts[i])
               .methods.getGiftStats()
               .call()
       )
   }

console.log (giftStats)

[ Result { '0': '0xfAA7541C5cBe22E4518736D2b5fC34D07347eE45', '1': '0x0000000000000000000000000000000000000000', '2': '0x0000000000000000000000000000000000000000', '3': '0', '4': '0', '5': '0', '6': '5000', '7': '0', '8': false, '9': false, '10': '' }, Result { '0': '0xfAA7541C5cBe22E4518736D2b5fC34D07347eE45', '1': '0x0000000000000000000000000000000000000000', '2': '0x0000000000000000000000000000000000000000', '3': '0', '4': '0', '5': '0', '6': '100', '7': '0', '8': false, '9': false, '10': '' } ]

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