javascript - Javascript将ethereum web3 json对象转换为数组
问题描述
我正在与 web3 合作,试图从以太坊主网上提取实时数据。承诺返回一个 JSON 对象,我想获取最后 10 个块的信息并将这个对象推送到一个数组latest
中,以便我可以使用类似的东西将它输出到其他地方,例如latest[0].difficulty
.
每次我将块信息推送到数组中时,它似乎只是以一种奇怪的方式将它捆绑在一起,这样当我这样做时latest.length
它就会返回为0
我认为我可以对数组和对象进行入门,但非常感谢任何信息。
window.addEventListener('load', function() {
// sconsole.log('No Web3 Detected... using HTTP Provider')
const web3 = new Web3(new Web3.providers.WebsocketProvider("wss://rinkeby.infura.io/ws"));
console.log('Web3 Detected! ')
window.web3 = new Web3(web3.currentProvider);
if (typeof window.web3 !== 'undefined') {
// You have a web3 browser! Continue below!
// startApp(web3);
init()
//alert("Web3");
}
})
async function getArray() {
latest = []
await web3.eth.getBlockNumber(function(error, blockNumber) {
for (var i = 0; i < 10; i++) {
web3.eth.getBlock(blockNumber - i).then(obj => {
latest.push(obj)
})
}
})
return latest
}
async function init() {
await getArray().then(v => {
console.log(v.length)
console.log(v)
})
}
块上初始 for 循环的数据输出如下所示,基本上是 10 个单独的对象,其中包含这些块的数据
{
difficulty:"1"
extraData:"0xd683010811846765746886676f312e3130856c696e7578000000000000000000cf7828c6662bacad0822d8bdc84a93344f25a1902c54fecb714667177a997dc9569305ec918859784fa1849509da15003eb46f53e831b630991697f3debb842600"
gasLimit:7134847
gasUsed:7070346
hash:"0xb7fff64678bb329288fbec01aaa57038250403674297d754b686b50f5c5c273f"
logsBloom:"0x00002000024010080000022040108000000000000000008001002004000004000000021000000800000000200006000000000080000000000000000000000002000000000020000000000008000000000000000000001004000000000000004000000000020000002000000000000000000000000000040000000010000000000020108000000000080088000008000000000000000000000000000000000000000080004002000008000002c00000000000000000000000002010000010000002000002000000000010800000000000000000040008000000000000000000100000800200000400000000000480000022000000000480000000000000008000"
miner:"0x0000000000000000000000000000000000000000"
mixHash:"0x0000000000000000000000000000000000000000000000000000000000000000"
nonce:"0x0000000000000000"
number:3077903
parentHash:"0x4ca2eabaa9d5759170be9efb43d0a803ab11c8ab35f9649701456a5c2448d781"
receiptsRoot:"0x7467d9dabf04e6b8037786dd62b2cc1a7b9aad85cb5188ab44e8ba2b82b90b54"
sha3Uncles:"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
size:3166
stateRoot:"0xa81abd0e2f1017179e6ccbc8bf88b579041e65eec7efbce2c763b3b982869191"
timestamp:1538295579
totalDifficulty:"5718449"
transactions:(9) ["0x172af85792c52de0adf86841816523db6cd3bcfac8f0e01f6eb2bcac46621dff", "0xe6dc06855a3514eb41e1770ff4b731a1b1ed4672ae4afd3537e3f04594b8a8ba", "0x622f667af2d6741642b42873ce002b11e98472b86d2fc26a011c085e67fc68e5", "0x6cf3f5a6f0c22ce26bec9372b23bd9b434b1d7371592c272203492da1feb1f9e", "0xaebcdd5fc8f29fc8c265c2b0bc261665e2f5bc7d8c0acf711886731d47ad7158", "0x0ee2d28ba83cc9f3f82b2c8184e51719006d3bd38102d9d7e99dc5803c499ab7", "0x56314a0423a3683feda5e4a6eb9117e35e07e853b8ae28d91dbfc597fa04d98a", "0xaaaee387c6837a8531b3d38fbed0961d8cb34924c4a6fe5ce5e907c793c81359", "0xb5580743c4bcf879c9059d785b9821c8d6d41d68f4a751bc097c74a5ef2d5517"]
transactionsRoot:"0xc15d937720ee7807fce8606c66af67c495afd917fd733a2a6121a410b8530019"
}
解决方案
何时使用 await 运算符以及何时使用回调函数似乎有些混乱,因为您试图同时使用这两者。
我已将代码更改为仅使用 promise 版本和 await 运算符。
getArray = async () => {
const blocknumber = await web3.eth.getBlockNumber()
for (var i = 0; i < 10; i++) {
const block = await web3.eth.getBlock(blocknumber - i)
latest.push(block)
}
return latest
}
这将正确返回一个由十个块组成的数组,从当前块号开始倒数。
当你想使用它时,你可以这样称呼它:
someAsyncFunctionWhereWeAreWorking = async () => {
const blocks = await this.getArray()
blocks.map(block => {
//we can do things here to each item of the block
console.log(block.difficulty)
})
}
请注意,这必须从async
函数中调用
推荐阅读
- xcode - 添加用户时 App Store Connect 允许开发人员资源复选框
- javascript - Javascript 类方法装饰器访问 this
- unetstack - 使用带有 groovy 脚本的 unetstack 查找两个节点之间的距离
- python - ctrl 单击不适用于 python 项目 pydeveditor
- ionic-framework - 为离子标签项目设计样式
- arrays - 您可以将函数存储在数组中并根据需要调用它们吗?
- ruby-on-rails - ActiveRecord::RecordInvalid:验证失败:密钥不能为空
- django - 努力在 DetailView 页面中显示复选框数据
- javascript - 如何在 JavaScript 中使用 PHP?
- domain-driven-design - 领域驱动设计 - 从 UI 增量保存