.then() 函数永远不会为调用区块链而运行
Posted
技术标签:
【中文标题】.then() 函数永远不会为调用区块链而运行【英文标题】:.then() function never running for call to blockchain 【发布时间】:2022-01-06 06:54:53 【问题描述】:请在下面找到我的代码 sn-p。这里 credentialHash 没有在 .then() 调用中设置。 “当时”或“回调被拒绝”都没有被打印,所以我知道它没有运行,但我不明白为什么。我还在我的智能合约中包含了 setHash 函数的代码。
let hash;
await ipfs.add(JSON.stringify(this.state.credential)).then((result, error) =>
hash = result.path;
if (error)
console.error(error)
return;
// Store hash on blockchain
console.log("Hash before BC:" + hash);
this.state.contract.methods.setHash(hash).send(from: this.state.account).then((resolve) =>
console.log("In then")
this.setState(credentialHash: hash);
, (rejected) =>
console.log("Callback rejected");
);
console.log("After setting:" + this.state.credentialHash);
);
function setHash(string memory _CredentialHash) public returns(string memory) credentialHash = _CredentialHash; return _CredentialHash;
console.log(this.state.contract.methods.setHash(hash).send(from: this.state.account))
返回的结果是:
Proxy promise: Promise, eventEmitter: EventEmitter, resolve: ƒ, reject: ƒ
[[Handler]]: Object
get: ƒ proxyHandler(target, name)
[[Prototype]]: Object
[[Target]]: PromiEvent
eventEmitter: EventEmitter
_events: Events
[[Prototype]]: Object
_eventsCount: 0
[[Prototype]]: Object
promise: Promise
[[Prototype]]: Promise
[[PromiseState]]: "pending"
[[PromiseResult]]: undefined
reject: ƒ ()
resolve: ƒ ()
[[Prototype]]: Object
[[IsRevoked]]: false
【问题讨论】:
如果你知道 "fulfilled" 回调没有被执行然后检查 "rejected" 回调 ->.then(onFulfilled[, onRejected])
如果你把它添加为.then()
,你为什么要await
一个Promise?或者更确切地说,如果您已经 await
它,为什么还要在 Promise 中添加 .then()
?您正在混合两种语法风格
@JeremyThille 只要 .then 返回一个承诺,就可以混合它们......看起来不是这样
@JeremyThille 我已经删除了 ipfs.add(...) 之前的等待,问题仍然存在。我对 js 很陌生。
@Andreas 我尝试使用更新的代码测试被拒绝的回调,在任何一种情况下都没有打印日志。
【参考方案1】:
尝试完全删除.then()
语法并仅使用async/await
样式。下面的代码给出了什么?
let hash, result;
try
result = await ipfs.add(JSON.stringify(this.state.credential))
hash = result.path;
catch (error)
console.error(error)
return;
// Store hash on blockchain
console.log("Hash before BC:" + hash);
try
await this.state.contract.methods.setHash(hash).send(
from: this.state.account
)
catch(error)
console.log("Callback rejected");
return
this.setState(
credentialHash: hash
);
console.log("After setting:" + this.state.credentialHash);
【讨论】:
感谢 sn-p。这只会打印“BC 之前的哈希:xyz”,因为它卡在await this.state.contract.methods.setHash(hash).send( from: this.state.account )
所以它永远加载而没有解决。不过不知道这个函数是做什么的
setHash 函数包含在 OP 中,本质上为智能合约设置 credentialHash 值并返回
是的,但我的意思是它在实践中做什么;不是它的目标是什么,它的代码实际上在做什么(最有可能是 HTTP 调用)。因为这个功能似乎永远挂起,这就是你的麻烦之源
该调用正在为我在使用 Ganache 在本地运行的区块链上的智能合约调用我的方法。 get 调用适用于同一个合同,所以我非常不确定问题是什么。如果我将其记录在 OP 中,我已经添加了调用返回的结果 :)【参考方案2】:
对于其他有此问题的人,我终于找到了答案。 transactionConfirmationBlocks 的默认数量是 24,这需要很长时间才能完成。如下将其设置为 1 解决了我的问题。
this.setState(contract: new web3.eth.Contract(
credentialArtifact.abi,
deployedNetworkCred.address,
transactionConfirmationBlocks: 1
));
【讨论】:
以上是关于.then() 函数永远不会为调用区块链而运行的主要内容,如果未能解决你的问题,请参考以下文章
央行定调!区块链不能搞形象工程,法定数字货币匿名离线支付没问题
web3 (python) 创建的交易不会反映在以太坊区块链上