【问题标题】:blob to base64 conversion synchrorously in Javascript在 Javascript 中同步 blob 到 base64 转换
【发布时间】:2022-01-13 16:23:30
【问题描述】:

我正在调用 javascript 函数来初始化 Oracle Visual Builder (VBCS) 中的变量值。该函数以二进制数据为输入,需要同步返回Base64转换后的字符串,以便将Base64转换后的字符串赋值给VBCS变量。

该函数不返回经过 Base64 转换的字符串。如何让它返回 Base64 字符串给调用函数?

PageModule.prototype.convertbase64 = function (data) {

    const blob = new Blob([data], {

      type: "application/octet-stream"

    });

    function blobToBase64(blob) {
      return new Promise((resolve, reject) => {
        const reader = new FileReader();
        reader.readAsDataURL(blob);
        reader.onloadend = () => resolve(reader.result.toString().substr(reader.result.toString().indexOf(',') + 1));
        reader.onerror = error => reject(error);
        console.log(new Date());
      });
    };

    const retstring = blobToBase64(blob).then(finalString => { return finalString });
 
    console.log('retstring value', retstring);

    return retstring;

};

【问题讨论】:

  • 1.你的承诺不会返回任何东西,只是记录new Date(); 2. 你在承诺完成之前登录retstringthen 部分。移动console.log('retstring value', retstring);reader.onloaded
  • @Justinas - 承诺是通过字符串实现的,不是吗?
  • .then(finalString => { return finalString }) 毫无意义,它只是创建一个新的承诺,等待承诺被履行,然后传递履行价值。另见:stackoverflow.com/questions/29516390/…
  • 什么是data
  • 读取 blob 可能是一项耗时(在计算机方面)的操作;例如,它可能涉及从磁盘读取文件。很难证明是否定的,但我认为没有 any 方法可用于同步读取 blob 的内容,这就是该代码(稍微过时)使用 @987654331 的原因@。如果您查看Blob 接口,您会看到几种读取其内容的方法(textarrayBufferstream),它们都是a同步的。有...

标签: javascript promise base64


【解决方案1】:

问题出在这一行

const retstring = blobToBase64(blob).then(finalString => { return finalString });

您应该等待 blobToBase64 的结果并将函数 convertbase64 设为异步。

const retstring = await blobToBase64(blob);

这里是完整的例子。

PageModule.prototype.convertbase64 = async function (data) {

const blob = new Blob([data], {
  type: "application/octet-stream"
});

function blobToBase64(blob) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.readAsDataURL(blob);
    reader.onloadend = () => resolve(reader.result.toString().substr(reader.result.toString().indexOf(',') + 1));
    reader.onerror = error => reject(error);
    console.log(new Date());
  });
};

const retstring = await blobToBase64(blob);

console.log('retstring value', retstring);

return retstring;
};

【讨论】:

  • 来自问题:"...需要返回base64转换后的字符串syncronously..."根据定义,一个async函数是同步。
猜你喜欢
  • 2015-01-31
  • 2017-11-21
  • 2015-03-14
  • 2018-10-07
  • 2018-11-10
  • 2013-07-29
  • 2013-09-10
  • 2011-09-07
  • 2016-07-02
相关资源
最近更新 更多