当前位置: 首页 > 知识库问答 >
问题:

如何使用componentDidMount()在render()中创建一个异步返回promise链?

莫振
2023-03-14

我的render函数中的return中有一个按钮,它调用了一个函数,该函数启动了一个promise链,结果更新了一个状态变量。但是,不传递该值。

我在componentDidMount()上尝试了一些尝试,但没有任何运气

这是我的渲染函数中的按钮

addIPFSItem(){

var searchAddress = "0x9Cf0dc46F259542A966032c01DD30B8D1c310e05";

const contract = require('truffle-contract')
const simpleStorage = contract(SimpleStorageContract)
simpleStorage.setProvider(this.state.web3.currentProvider)


this.state.web3.eth.getAccounts((error, accounts) => {
  simpleStorage.deployed().then((instance) => {
    this.simpleStorageInstance = instance

    return this.simpleStorageInstance.getLength(searchAddress);
  }).then((accountLength) => {

    var items = []
    const ipfsPrefix = "https://ipfs.io/ipfs/";

    var i;
    for (i = 0; i < accountLength; i++) {
      var currHash = this.simpleStorageInstance.getBook(searchAddress, i, 
  {from: searchAddress});

      var currURL = ipfsPrefix + this.currHash;

      //Here I am printing the counter values, and it prints the correct 
      //amount
      console.log('itemhash ', i)
      items.push(currHash)
    }
    //I do not get the value of items[1] in the console, but an undefined
    //promise
    console.log('address URL ', items[1])

    //the state of ipfsHash is not updated correctly
    return this.setState({ipfsHash: items[1]});
  })
 })
}

console.log('address URL',items[1])应给出类似address URL 0x9CF0DC46F259542A966032C01DD30B8D1C310E05的内容。但是,我得到的却是地址URLpromise{ }

共有1个答案

尹辰沛
2023-03-14

您的this.SimpleStorageInstance.getBook是一个promise,这意味着它是异步执行的。

要获得结果,您必须使用.then或新语法async/await。使用以下函数,您的items数组将填充正确的数据:

如果选择此解决方案,则必须将async关键字放在父函数名称之前

for (i = 0; i < accountLength; i++) {
    items.push(await this.simpleStorageInstance.getBook(searchAddress, i, { from: searchAddress }))
}
const items = myAccounts.map(async () => await this.simpleStorageInstance.getBook(searchAddress, i, { from: searchAddress }))
 类似资料:
  • 问题内容: 在React Native中用作异步函数是一种好习惯还是应该避免呢? 我需要从安装组件时获取一些信息,但是我知道使之成为可能的唯一方法是使函数异步。 这有什么问题吗,还有其他解决方案吗? 问题答案: 让我们首先指出差异并确定差异可能如何引起麻烦。 这是异步和“同步” 生命周期方法的代码: 通过查看代码,我可以指出以下差异: 该关键字:在打字稿,这仅仅是一个代码标记。它做两件事: 强制将

  • 问题内容: 如何从异步函数返回值?我试图喜欢这个 它给了我, 问题答案: 您不能超出范围。为了获得预期的结果,您应该将其包装到异步IIFE中,即 样品。 有关更多信息 由于返回一个Promise,因此可以将其省略,如下所示: 然后像以前一样做

  • 我有一个windows服务,我从另一个开发人员继承,它运行非常慢,并有许多对eBay API的缓慢调用。我希望在没有太多重构的情况下加快它。 我刚刚开始研究使用C#Async/Await来尝试让这些缓慢的调用运行异步。以下是我试图实现的目标: 如何获取返回的类型以便使用它们?我尝试使用,但它只有属性可用。

  • 我需要自动化一些web服务,为此我创建了一些方法,我想用Cucumber来实现,但是我不知道如何在下一步使用返回值。 所以,我有这个功能: 我有这个步骤: 有什么方法可以一步到另一步使用返回的值? 谢谢大家!

  • 问题内容: 如何从异步函数返回值?我试图喜欢这个 它给了我, 问题答案: 您不能超出范围。为了获得预期的结果,您应该将其包装到异步IIFE中,即 样品。 有关更多信息 由于返回一个Promise,因此可以将其省略,如下所示: 然后像以前一样做

  • 我有endpoint,它可以返回同步和异步结果 如何刻意返回某物,即同步?