gpt4 book ai didi

javascript - 滥用 await 作为 return 语句的缺点?

转载 作者:行者123 更新时间:2023-12-03 12:18:15 24 4
gpt4 key购买 nike

我偶然发现了一种有趣但相当黑的方法来使用 Javascript 中的 promises 编写线性代码,如下所示:

const return_by_death = new Promise((resolve) => {});

const signup = async (req, res) => {
const user = req.body.username;
const pass = req.body.password;

if(!user || !pass) {
res.sendStatus(400);
return;
}

const hash_data = await generate_hash(pass).catch(async (err) => {
res.sendStatus(500);
await return_by_death;
});

const new_account = new models.account.model({
username: user,
salt: hash_data.salt,
hash: hash_data.hash
});
// ...
};

从我的实验来看,它的工作方式似乎是,如果来自 generate_hash 的 promise 被拒绝,它将进入我的错误处理程序,而不会移动到 new_account 行。我的问题如下:

  1. 这是否通过生成无限期挂起的 promise 或执行线程来浪费内存?

  2. expressjs 是否保留传递给 app.get(path, func) 的函数,它会跟踪可能永远无法解决的注册 promise ?

  3. 有更好的方法吗?

编辑:根据@CertainPerformance 的回答/信息,我想出了以下解决方案

class PromiseRunError {
constructor(obj) {
this.obj = obj;
}
}

Promise.prototype.run = function() {
return this.catch((err) => {return new PromiseRunError(err)}).then((data) => {
if(data instanceof PromiseRunError) {
return [undefined, data.obj];
}
return [data, undefined];
});
};

const [hash_data, hash_gen_err] = await generate_hash(pass).run();

if(hash_gen_err) {
res.sendStatus(500);
return;
}

最佳答案

是的,在这里使用永久 Unresolved Promise 是一个问题。

  • 如果 signup 被多次调用,并且生成了许多挂起的 Promise,随着时间的推移,将使用越来越多的内存;每次调用 signup 都会产生一个包含 userpassreqres< 的新闭包 分配的变量,在函数结束之前不能被垃圾收集。 (但如果有错误,它永远不会结束。)
  • 从可读性的 Angular 来看,它非常令人困惑。

如果你想让事情尽可能平坦,而不是将所有东西都包围在 try/catch 中,假设 generate_hash 返回一个 Promise那,如果它解决了,将解决一些真实的事情,只是不要在 .catch 处理程序中返回任何东西,然后在继续之前检查 hash_data 是否真实:

const signup = async (req, res) => {
const user = req.body.username;
const pass = req.body.password;

if(!user || !pass) {
res.sendStatus(400);
return;
}

const hash_data = await generate_hash(pass).catch(() => {});
if (!hash_data) {
res.sendStatus(500);
return;
}

const new_account = new models.account.model({
username: user,
salt: hash_data.salt,
hash: hash_data.hash
});
// ...
};

不过,我更喜欢try/catch:

const signup = async (req, res) => {
try {
const { user, pass } = req.body;
if (!user || !pass) {
res.sendStatus(400);
return;
}

const hash_data = await generate_hash(pass)
const new_account = new models.account.model({
username: user,
salt: hash_data.salt,
hash: hash_data.hash
});
// ...
} catch (e) {
res.sendStatus(500);
return;
}
};

关于javascript - 滥用 await 作为 return 语句的缺点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66096566/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com