我想知道是否有一种从Javascript中的函数实现单个退出点的简洁方法。在普通C中,可以简单地使用goto
(Linux kernel - example source)。
第一眼就可以使用for, break and labels
和exceptions
。
var retCode = 0;
single_exit:
for(var done=true;done;done=false)
{
retCode = 1;
break single_exit;
}
if(retCode !=0)
{
console.log('error happened. exiting');
return;
}
function SomeError () {
this.retcode = 1;
}
SomeError.prototype = new Error();
try{
if(someThing)
throw new SomeError();
}
catch(e) {
if (e instanceof SomeError) {
return e.retcode;
} else {
throw e;
}
}
还有其他(更好的)方法来处理这种情况吗?
答案 0 :(得分:2)
我认为@Robert Levy有一个非常好的观点。处理单一退出点的好方法意味着承诺:
使用来自nodejs的q
模块,可以写:
var Q = require('q');
Q.fcall(function(){
})
.then(function(){
})
.then(function(){
})
.catch(function(err){
//log them
})
.done(function(){
do other stuff
})
答案 1 :(得分:1)
我认为问题出现在一个大型函数中,你不想重复释放资源等操作。
然后解决方案可能是定义一个简单的函数:
function yourFunction(){
var resource = thing();
function quit(){
resource.release();
}
... lot of code ...
if (...) return quit();
...
}
另一个解决方案可能是将你的功能包装在另一个中:
function bigFunWrapper(){
var resource = thing();
yourFunction();
resource.release();
}
此解决方案,如果您不从多个地方调用它,可以重写为IIFE:
(function(){
var resource = thing();
yourFunction();
resource.release();
})();
根据具体的使用案例,可能有更好的解决方案。
答案 2 :(得分:1)
使用承诺。
类似的东西:
doSomething().then(
function() {
doSomethingElse().then(
function(){
doYetAnotherThing()
})
});
return 42;
其中doSomething,doSomethingElse和doYetAnotherThing代表可能会破坏的各个步骤' (现在中断意味着'返回标记为失败的承诺)。他们每个人都应该回报一个承诺。为了使代码更平坦,您可以选择在Angular的上下文中进行promise-chaining(here's a good video,但是您可以忽略该部分)
答案 3 :(得分:0)
现在,在我回答这个问题之前,请让我明确指出:
我认为这是一种反模式!不要使用,但是对你的部分问题采用一种有趣的方法。
var returnCode = null;
do {
// Do calculation
if (condition) break;
// do calculation
if (condition2) break;
} while (false);
return returnCode;
说明:do...while
循环必须至少运行一次。 false
条件确保它只运行一次。 break
退出循环并跳到底部。