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
)将已经可用到你调用其他函数的时候。
PubKey
和 PriKey
不需要异步,在这两种情况下你都没有 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
处理程序中的下游。调用方负责 catch
ing 错误。始终处理错误 -
myfunction().then(console.log).catch(console.error)
如果您不理解这些简单的事情,请不要尝试实施加密解决方案。您将 100% 出错并引入漏洞,您和您的用户将承受后果。
此答案中的代码未经测试,仅在此突出显示我很容易看到的错误。不要逐字使用代码,也不要期望它 copy/paste 直接进入您的项目。我不明白您的要求或意图是什么,因此无法提出建议或提供其他建议。
有关滥用 async
和 await
的更多信息,请参阅 this related Q&A。
在函数链中使用多个 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
)将已经可用到你调用其他函数的时候。
PubKey
和 PriKey
不需要异步,在这两种情况下你都没有 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
处理程序中的下游。调用方负责 catch
ing 错误。始终处理错误 -
myfunction().then(console.log).catch(console.error)
如果您不理解这些简单的事情,请不要尝试实施加密解决方案。您将 100% 出错并引入漏洞,您和您的用户将承受后果。
此答案中的代码未经测试,仅在此突出显示我很容易看到的错误。不要逐字使用代码,也不要期望它 copy/paste 直接进入您的项目。我不明白您的要求或意图是什么,因此无法提出建议或提供其他建议。
有关滥用 async
和 await
的更多信息,请参阅 this related Q&A。