如何从获取承诺中返回base64数据?

时间:2019-08-04 13:17:02

标签: javascript reactjs

我想将图像从URL转换为base 64,并将其存储在状态中以备后用。

如何从fetch()返回数据?

我可以使用CORS安全图片和HTML画布来使其正常工作,但这不适用于公共领域。

  openImage = (index) => {
    const url = formatURLs[index];
    const base64 = this.getBase64Image(url);

    this.setState(prevState => ({
      currentImage: index,
      currentImagebase64: base64
    }));
  }

  getBase64Image(url) {
    fetch(url).then(r => r.blob()).then(blob => {
      var reader = new FileReader();
      reader.onload = function() {
           var b64 = reader.result.replace(/^data:.+;base64,/, '');
           return b64;
      };
      reader.readAsDataURL(blob);
    });
  }

当我console.log(reader.result)时,它将按预期输出base64。

但是,当我返回b64时,它将以'undefined'的形式返回到openImage。

2 个答案:

答案 0 :(得分:1)

getBase64Image是异步的,因此当以同步方式调用它时,它将返回未定义的状态。

您可以尝试类似的事情

  openImage = async (index) => {
    const url = formatURLs[index];
    const base64 = await this.getBase64Image(url);
    this.setState(prevState => ({
      currentImage: index,
      currentImagebase64: base64
    }));
  }

  async getBase64Image(url) => {
    const response = await fetch(url);
    const blob = await response.blob();
    const reader = new FileReader();
    await new Promise((resolve, reject) => {
      reader.onload = resolve;
      reader.onerror = reject;
      reader.readAsDataURL(blob);
    });
    return reader.result.replace(/^data:.+;base64,/, '')
  }

答案 1 :(得分:0)

您必须在.then()内部设置状态

getBase64Image(url) {
    fetch(url).then(r => r.blob()).then(blob => {
      var reader = new FileReader();
      reader.onload = function() {
           var b64 = reader.result.replace(/^data:.+;base64,/, '');
           this.setState({
             currentImagebase64: b64
           });
      };
      reader.readAsDataURL(blob);
    });
  }