【问题标题】:.then() function never running for call to blockchain.then() 函数永远不会为调用区块链而运行
【发布时间】: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 我尝试使用更新的代码测试被拒绝的回调,在任何一种情况下都没有打印日志。

标签: javascript promise blockchain ethereum web3


【解决方案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}
  )});

【讨论】:

    猜你喜欢
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多