为什么我的函数不返回错误字符串?

时间:2016-11-30 19:00:37

标签: javascript typescript knockout.js

我的功能如下。除了不返回我想要的错误字符串外,它还能满足需要。

它总是返回“”。

我已经设置断点并看到它进入每个错误情况,但它不会返回那里。它在函数结束时返回。

我迷路了,我确定我犯的是一个非常愚蠢的错误,但我不明白......

请给我留下我喜欢的几根头发:)

    public validatePanel = () => {
        this.Queries().forEach(function(q, i) {

            if(q.from() == "" || q.from() == null || q.from() == undefined) {
                return "Please select a database";
            }

            if(q.select().length > 0) {
                q.select().forEach(function(s, j) {
                    if(s.selectoption() == "" || s.selectoption() == null || s.selectoption() == undefined){
                        return "Please select a stat to show";
                    }
                });
            }

            if(q.where().length > 0) {
                q.where().forEach(function(w, j) {
                    if(w.whereoption() == "" || w.whereoption() == null || w.whereoption() == undefined){
                        return "Please select a filter to filter on";
                    }

                    if(w.wherevalue() == "" || w.wherevalue() == null || w.wherevalue() == undefined) {
                        return "Please select a value for your filter";
                    }
                });
            }
        });

        return "";
    }

1 个答案:

答案 0 :(得分:2)

正如Alex Bykov指出的那样,你的forEach函数不会导致返回。

根据MDN

,您的问题原因为何

函数的返回值未定义

  

返回

     

值未定义。

这意味着您无法做任何事情都会生成您可以使用的返回值。此外,根据MDN,除了抛出异常之外,无法停止或中断循环。

  

除了by之外,没有办法停止或中断forEach()循环   抛出一个例外。如果需要这样的行为,请使用forEach()方法   是错误的工具,而是使用普通循环。如果你正在测试   你需要一个谓词的数组元素并需要一个布尔返回值   可以使用every()或some()代替。如果可用,新方法   find()或findIndex()可以在true时用于提前终止   也是谓词。

这意味着您需要在forEach循环中抛出异常,然后捕获异常并返回如下所示的字符串 (除非你使用正常的for循环然后你可以做任何你喜欢的事情

try {
       this.Queries().forEach(function(q, i) {

            if(q.from() == "" || q.from() == null || q.from() == undefined) {
                throw "Please select a database";
            }

            if(q.select().length > 0) {
                q.select().forEach(function(s, j) {
                    if(s.selectoption() == "" || s.selectoption() == null || s.selectoption() == undefined){
                        throw "Please select a stat to show";
                    }
                });
            }

            if(q.where().length > 0) {
                q.where().forEach(function(w, j) {
                    if(w.whereoption() == "" || w.whereoption() == null || w.whereoption() == undefined){
                        throw "Please select a filter to filter on";
                    }

                    if(w.wherevalue() == "" || w.wherevalue() == null || w.wherevalue() == undefined) {
                        throw "Please select a value for your filter";
                    }
                });
            }
        });
}
catch(err) {
console.log(error);
}