Javascript 滥用wait as return语句的缺点是什么?
我无意中发现了一种有趣但相当老套的方法,可以用Javascript编写带有承诺的线性代码,如下所示:Javascript 滥用wait as return语句的缺点是什么?,javascript,node.js,express,async-await,es6-promise,Javascript,Node.js,Express,Async Await,Es6 Promise,我无意中发现了一种有趣但相当老套的方法,可以用Javascript编写带有承诺的线性代码,如下所示: const return_by_death = new Promise((resolve) => {}); 及 从我的实验来看,如果generate\u hash的承诺被拒绝,它将进入我的错误处理程序,而不转到新的\u帐户行。我的问题如下: const return_by_death = new Promise((resolve) => {}); 这是否会因为生成无限期挂起的承诺
const return_by_death = new Promise((resolve) => {});
及
从我的实验来看,如果generate\u hash的承诺被拒绝,它将进入我的错误处理程序,而不转到新的\u帐户行。我的问题如下:
const return_by_death = new Promise((resolve) => {});
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];
});
};
及
是的,在这里使用永久未解决的承诺是一个问题
- 如果
被多次调用,并生成许多挂起的承诺,那么随着时间的推移,将使用越来越多的内存;每次调用signup
都会导致分配了signup
、user
、pass
和req
变量的新闭包,在函数结束之前,这些变量不能被垃圾收集。(但如果出现错误,它将永远不会结束。)res
- 从可读性的角度来看,它非常混乱
中,请尝试/catch
,假设generate\u hash
返回一个承诺,如果它解决了,将解决一些真实的问题,只需在.catch
处理程序中不返回任何内容,然后检查哈希_数据是否真实,然后继续:
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
});
// ...
};
我更喜欢尝试
/捕获
,不过:
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;
}
};
在这种情况下,hash_数据从何处获取其假值?我假设.catch使用错误时的返回值解析原始承诺是否正确?是的,因此如果在.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;
}
};