2016-11-11 81 views
2

一个常见的成语是javascript和其他类似C语言就是用这样的逻辑“或”运算符:简洁的语法为“做这个或抛出一个错误”

function f(x) { 
    return (foo(x) || -1); 
} 

返回-1,如果FOO (x)返回null(或零,或空字符串)。

如果不是返回一个不同的值,我想抛出一个错误? throw是关键字,而不是函数,因此它不能用于||的右侧。基本上我想这样做:

function foo(x) { 
    result = bar(x); 
    if(result) {return result;} 
    throw "bar(x) didn't return a value"; 
} 

可以做得更简洁(和少冗余)?

回答

1

在理论上要简单得多,你可以做

function f(x) { 
    return foo(x) || (() => { throw "foo(x) didn't return a value"; })(); 
} 

或类似的东西,但你的原始代码没有什么错。

您也可以尝试

function error(x) { throw x; } 
function f(x) { return foo(x) || error("foo(x) didn't return a value"); } 

尽管这将报告里面error()发生的错误。

如果是选项,则可以考虑重新设计barfoo以引发错误本身。

1

使用高阶函数:

function throw_on_bad(f) { 
    var result = f(); 

    if (result) { 
     return result; 

    } else { 
     throw "Passed function didn't return a value"; 
    } 
} 

throw_on_bad(function() { 
    return bar(x)); 
}); 

或用ES6:

throw_on_bad(() => bar(x)); 

可能返回一个坏的结果是包裹在其他功能延迟执行的功能。如果bar不带任何参数,可以简单地写成:

throw_on_bad(bar); 

没有宏,它不会比

相关问题