【问题标题】:Blob to Uint8Array without callbackBlob 到 Uint8Array 没有回调
【发布时间】:2021-10-31 00:18:56
【问题描述】:

是否可以在不使用回调且仅使用 JavaScript 的情况下将 Blob 转换为 Uint8Array?

如何返回调用变量uint8datauint8array

let str='content';

str2blob=(str,type='text/plain')=>new Blob([str],{type:type});

let blob=str2blob(str);

function blob2uint(blob){
    new Response(blob).arrayBuffer().then(buffer=>{
        uint=[...new Uint8Array(buffer)];
        console.log("Uint8Array",uint);
        return uint;
    });
}

let uint8data=blob2uint(blob);
console.log(uint8data); //Show Uint8Array

【问题讨论】:

  • 你是否对异步有问题(需要同步访问),或者你只是不喜欢回调函数(在这种情况下async/await将是一个解决方案) ?
  • 准确来说,如何让uint8data变量等待blob2uint函数的返回?
  • 使用async/await 来做到这一点。整个使用uint8data的函数都会变成异步的,没有办法避免。
  • 我认为我没有正确表达自己。我会再试一次。我需要的是 blob2uint 函数以与 str 变量从 srt2blob 函数接收数据相同的方式将数据返回到 uint8data 变量,而不使用回调函数。你能给我举个例子吗?创建 blob 变量只是为了说明我的示例。
  • async/await 不使用任何回调函数。但是不,你不能立即从函数中返回数据,你能做的最好的就是为它返回一个承诺。它是异步的,处理它 - 或者不要使用 blob。另见stackoverflow.com/q/17068610/1048572

标签: javascript blob arraybuffer uint8array


【解决方案1】:

假设这是在函数内部的某个地方,您可以将其设为异步,并在您从 blob2uint 函数返回 Promise 后使用 await 等待它完成:

async function myBlobToUIntDemo() {
  let str='content';

  str2blob=(str,type='text/plain')=>new Blob([str],{type:type});

  let blob=str2blob(str);  

  function blob2uint(blob){
      return new Response(blob).arrayBuffer().then(buffer=>{
          uint=[...new Uint8Array(buffer)];
          console.log("Uint8Array",uint);
          return uint;
      });
  }
  
  let uint8data = await blob2uint(blob);
  console.log(uint8data); //Show Uint8Array
}

让我们用更多信息来补充一下:

为什么我首先需要回调?

因为您通过从响应中提取 arrayBuffer 来执行异步工作。 JavaScript(据我所知)仅在单个线程中运行。如果您没有以某种方式将其置于后台,则在不使用回调的情况下等待代码中的网站会停止页面上的所有其他 JavaScript 执行;这就是回调和 Promises 为您所做的(至少从外部)。

承诺?

执行异步工作的函数通常返回一个Promise 对象,该对象承诺在工作完成后为您提供值(通过调用在then 回调中传递的函数)或在出现问题时返回错误(通过调用catch 回调)。

异步/等待

引入了 async / await 以使 Promises 的使用更加美观和易读,从而大大减少了对回调的需求。您可以在this MDN article 中阅读更多相关信息。

上面的代码块仅包含使事情正常进行的最低限度的更改。让我们再简化一点!

async function myBlobToUIntDemo() {
  let str = 'content';
  let str2blob = (str, type = 'text/plain') => new Blob([str], { type: type });
  let blob = str2blob(str);

  const buffer = await new Response(blob).arrayBuffer();
  const uint = [...new Uint8Array(buffer)];
  
  console.log(uint);
}

请注意,这也会返回一个 Promise(如果您将函数标记为异步,这会自动发生),因此请务必记住,如果您要在代码中的任何位置使用此函数。

【讨论】:

  • 您好,uint8data 变量必须在函数之外。我创建 blob 只是为了说明,但是 tks.
猜你喜欢
  • 1970-01-01
  • 2018-09-08
  • 2012-12-29
  • 1970-01-01
  • 2022-10-18
  • 2018-01-02
  • 2022-01-09
  • 2021-09-09
  • 1970-01-01
相关资源
最近更新 更多