【发布时间】:2021-05-11 18:14:54
【问题描述】:
我偶然发现了一种用 JavaScript 编写带有 Promise 的线性代码的有趣但相当老套的方法,如下所示:
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 的承诺被拒绝,它将进入我的错误处理程序,而不转到 new_account 行。我的问题如下:
-
这是否会通过生成无限期挂起的承诺或执行线程来浪费内存?
-
expressjs 是否保留传递给 app.get(path, func) 的函数,它会在其中跟踪可能永远无法解决的注册承诺?
-
有没有更好的方法来做到这一点?
编辑:根据@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;
}
【问题讨论】:
标签: javascript node.js express async-await es6-promise