.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() 函数永远不会为调用区块链而运行的主要内容,如果未能解决你的问题,请参考以下文章

央行定调!区块链不能搞形象工程,法定数字货币匿名离线支付没问题

第146篇 笔记-智能合约介绍

区块链与数据库到底有何不同?只是名字不一样吗?

web3 (python) 创建的交易不会反映在以太坊区块链上

以太坊 solidity pure view 交易执行之后不会生成区块

区块链通证经济:通往未来十年财富分配的新格局