无法访问异步函数的响应

时间:2019-03-03 18:06:47

标签: angular typescript asynchronous ipfs

我似乎找不到从异步值访问值的方法,因为它总是返回未定义的值,我想等待函数结束然后检索值,但它不起作用...

  async UploadFile(file): Promise<any> {

      let ipfsId: any
      const fileStream = fileReaderPullStream(file)
      await this.ipfs.add(fileStream, { progress: (prog) => console.log(`received: ${prog}`) })
      .then((response) => {
        ipfsId = response[0].hash
        console.log(ipfsId)
        return ipfsId
        //window.open("localhost:8080/ipfs/" + ipfsId);
        //window.open("https://ipfs.io/ipfs/" + ipfsId);
      }).catch((err) => {
        console.error(err)
      }) 

  }

这是我的电话:

  uploadFile(event) {

    const fileSelected: File = event.target.files[0];
    (async() => {
    this.temp_ipfs_hash = await this.IPFS.UploadFile(fileSelected)
    .then((response) => console.log(response))
    console.log(this.temp_ipfs_hash)
    })()

  }

我想访问返回值,但它总是返回未定义或错误值... 任何人都知道我可以在这里尝试什么?

非常感谢您的宝贵时间! :)

编辑:我不知道发布图像是错误的,所以抱歉,我已经更改了它!抱歉! :(

2 个答案:

答案 0 :(得分:0)

  • UploadFile应该返回一个Promise,它目前不返回任何内容。 为了兑现承诺,您应该将最后一行替换为

    return this.ifps.add(...).then(...).catch(...);


  • 使用await的替代方法:返回await,这是promise返回的结果值

    return await this.ifps.add(...).then(...).catch(...);

    在呼叫者中,您可以记录结果,就像没有承诺一样:

    console.log(this.UploadFile(fileSelected));

答案 1 :(得分:0)

您同时使用了基于promise的和异步等待的,您的上传文件功能应该返回一个promise,然后解析为适当地拒绝它,或者如果您要坚持异步等待机制,那么您的上传文件功能将必须更改。假设foobar是一个异步函数,例如ipfs.add

,这是应该使用async await的方式
async function foo() {
  let results = await foobar();
  return results;
}

这是您如何称呼此类foo

async function bar() {
  let fooResults = await foo();
  console.log(fooResults);
}