Не удается получить доступ к ответу асинхронной функции - PullRequest
0 голосов
/ 03 марта 2019

Я не могу найти способ получить доступ к значению из асинхронного значения, так как оно всегда возвращает неопределенное значение, я хотел бы дождаться завершения функции и затем извлечь значение, но оно не работает ...

  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 голосов
/ 03 марта 2019

Вы используете одновременно и обещание, основанное на обещаниях, и асинхронное ожидание, функция загрузки файла должна либо вернуть обещание, а затем разрешить его отклонение соответствующим образом, либо, если вы хотите придерживаться механизма асинхронного ожидания, вам придется изменить функцию загрузки файла.,Вот как следует использовать асинхронное ожидание, предположим, что foobar - это асинхронная функция, подобная вашей ipfs.add

async function foo() {
  let results = await foobar();
  return results;
}

Вот как вы будете вызывать такую ​​foo

async function bar() {
  let fooResults = await foo();
  console.log(fooResults);
}
0 голосов
/ 03 марта 2019
  • UploadFile должен вернуть обещание, в настоящее время он ничего не возвращает.Чтобы связать обещания, вы должны заменить последнюю строку на

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


  • Альтернатива с использованием await: возврат await, которыйзначение результата, возвращаемое обещанием

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

    В вызывающей стороне вы можете записать результат, как если бы обещание не было:

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

...