1

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

如何返回调用变量uint8data的uint8array

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
4

1 回答 1

0

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

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 的工作变得更好和可读,从而大大减少了对回调的需求。您可以在这篇 MDN 文章中了解更多相关信息。

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

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(如果您将函数标记为异步,这会自动发生),因此请务必记住,如果您要在代码中的任何位置使用此函数。

于 2021-09-01T13:47:06.447 回答