Javascript 滥用wait as return语句的缺点是什么?

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) => {}); 这是否会因为生成无限期挂起的承诺

我无意中发现了一种有趣但相当老套的方法,可以用Javascript编写带有承诺的线性代码,如下所示:

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

从我的实验来看,如果generate\u hash的承诺被拒绝,它将进入我的错误处理程序,而不转到新的\u帐户行。我的问题如下:

const return_by_death = new Promise((resolve) => {});
  • 这是否会因为生成无限期挂起的承诺或执行线程而浪费内存

  • 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];
        });
    };
    


    是的,在这里使用永久未解决的承诺是一个问题

    • 如果
      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;
        }
    };