如何访问getBlockByHeight返回的Promise中包含的Block对象的hash属性
问题原因
你调用getBlockByHeight返回的是Promise异步对象,不是直接返回查询到的Block实例,Promise本身没有hash属性,所以直接取值会返回undefined。你控制台看到的是pending状态已被resolve后的Promise打印结果,实际代码运行到previousBlock.hash时,要么Promise还没执行完成,要么你没有主动获取Promise resolve后的值。
解决方法1:使用async/await语法(更简洁)
给你调用这段逻辑的外层函数加上async关键字,调用方法前加await等待Promise执行完成,就能直接拿到Block对象:
// 外层函数加async修饰,如果是类方法写法为 async validateBlock(block) {...} async function validateBlock(block) { // 加await等待Promise resolve,直接拿到Block实例 let previousBlock = await self.getBlockByHeight(block.height - 1); // 现在可以正常访问属性,加可选链?.可避免查询结果为null时报错 let preBlockHash = previousBlock?.hash; // 后续验证逻辑 }
解决方法2:使用.then链式回调
如果你不想修改外层函数的async修饰,也可以用Promise自带的.then方法获取结果:
self.getBlockByHeight(block.height - 1) .then(previousBlock => { // 回调里拿到的previousBlock就是Block实例 let preBlockHash = previousBlock?.hash; // 后续验证逻辑写在这个回调内部 }) .catch(err => { // 可在这里捕获异步操作抛出的错误 console.log('查询区块出错:', err) })
内容的提问来源于stack exchange,提问作者Darragh Cahill
相关产品推荐
相关产品推荐

