ECMAScript 8,异步等待,语法错误 javascript

ECMAScript 8, async await, syntactical errors javascript

在函数链中使用多个 async() 破坏了我的函数。 有什么办法可以在 generateKey() 中包含 Key2pkcs8() 吗?

async function generateKey() {
  let getKeyPair = await crypto.subtle.generateKey(
    {
      name: "ECDH",
      namedCurve: "P-384"
    },
    false,
    ["deriveKey"]
  );

  let PriKey = async() => {
    let PriKey = await getKeyPair.privateKey;
    console.log("pri = " + PriKey);
    return PriKey;
  };
  let PubKey = async() => {
    let PubKey = await getKeyPair.publicKey;
    console.log("pub = " + PubKey);
  };

  let Key2pkcs8 = async(PriKey, PubKey) => {
    let Key2pkcs8Pub = await crypto.subtle.exportKey("pkcs8", PubKey);
    let Key2pkcs8Pri = await crypto.subtle.exportKey("pkcs8", PriKey);
    return pkcs8keyarray = [Key2pkcs8Pub, Key2pkcs8Pri];
  
  return Keyarray = [PriKey(), PubKey()];  // i want to put <return pkcs8keyarray()> here  
};

generateKey().then(Key2pkcs8 => console.log(Key2pkcs8[0], Key2pkcs8[1])); 按预期工作并且 returns pri = [object CryptoKey] Promise { <state>: "fulfilled", <value>: undefined } Promise { <state>: "fulfilled", <value>: CryptoKey }

但是当使用 return pkcs8keyarray() 而不是 return Keyarray = [PriKey(), PubKey()]; 时它会中断并且 returns undefined

我本来打算让 key2pkcs2 将密钥作为变量(public 或私钥),然后 return 两者都在最后的数组中,类似于示例

async function generateKey() {
  let keyPair = await crypto.subtle.generateKey(
    {
      name: "ECDH",
      namedCurve: "P-384"
    },
    false,
    ["deriveKey"]
  );

  let PriKey = (keyPair) => {
    let PriKey = keyPair.privateKey;
    console.log("pri = " + PriKey);
    return keyPair;
  };
  let PubKey = (keyPair) => {
    let PubKey = keyPair.publicKey;
    console.log("pub = " + PubKey);
    return keyPair;
  };

  let Key2pkcs8 = async(keyPair) => {
    console.log("key = " + keyPair);
    let Key2pkcs8 = await crypto.subtle.exportKey("pkcs8", keyPair);
    return Key2pkcs8;
  };

  let printme = async() => {
    let printme = await Key2pkcs8(PubKey());
    console.log(printme);
    return printme;
  };

  return printme();
}

用法:

generateKey().then(Key2pkcs8 => console.log(Key2pkcs8 ));

如果您的外部 iife 是异步的,await 将已经将异步流转换为同步流,这意味着 getKeyPair(或我的代码段中的 keyPair)将已经可用到你调用其他函数的时候。

PubKeyPriKey 不需要异步,在这两种情况下你都没有 returning 任何东西。 Key2pkcs8 也没有 returning 任何东西,所以你到底想要 await Key2pkcs8(PubKey()); 到 return 什么?理想情况下,如果您希望结果 Promise 解析为 undefined 以外的其他内容,那么所有这些函数都应该 return 。试试上面的代码片段,我没有测试它。

您的程序表现出对承诺、async/await、加密模块和整个 javascript 的误解。

  • 仅当您要将值重新分配给绑定时才使用 let
  • 不要将函数重新分配给值,尤其是在很容易避免的情况下
  • return Keyarray = ... 这样的语句正在泄漏全局变量,并且其行为可能与您预期的不同
  • 您不需要在每次想要 await 另一个异步值时都创建一个新的 async 函数
  • 您不能简单地 console.log 私钥或 public 密钥。 exportKey docs, it returns a promise that resolves to an ArrayBuffer 是原始字节数据,没有字符串表示形式。
async function generateKey() {
  const {privateKey, publicKey} =        // <- get privateKey, publicKey
    await crypto.subtle.generateKey(
      {
        name: "ECDH",
        namedCurve: "P-384"
      },
      true,
      ["deriveKey"]
    )

  return [
    await crypto.subtle.exportKey("pkcs8", privateKey), // <- export private
    await crypto.subtle.exportKey("pkcs8", publicKey),  // <- export public
  ]
}

由于 generateKey 返回一对 [private, public],我们可以轻松地在您编写的其他异步函数中使用它们 -

async function myfunction() {
  const [private, public] = await generateKey() // <- resolves pair
  // do something
}

将所有副作用移至 .then 处理程序中的下游。调用方负责 catching 错误。始终处理错误 -

myfunction().then(console.log).catch(console.error)

如果您不理解这些简单的事情,请不要尝试实施加密解决方案。您将 100% 出错并引入漏洞,您和您的用户将承受后果。

此答案中的代码未经测试,仅在此突出显示我很容易看到的错误。不要逐字使用代码,也不要期望它 copy/paste 直接进入您的项目。我不明白您的要求或意图是什么,因此无法提出建议或提供其他建议。

有关滥用 asyncawait 的更多信息,请参阅 this related Q&A