Javascript:从函数实现单个退出点

时间:2014-05-05 16:08:51

标签: javascript node.js design-patterns

我想知道是否有一种从Javascript中的函数实现单个退出点的简洁方法。在普通C中,可以简单地使用gotoLinux kernel - example source)。

第一眼就可以使用for, break and labelsexceptions

1。用于和标签

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;
}

2。例外

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; 
  }
}

还有其他(更好的)方法来处理这种情况吗?

4 个答案:

答案 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退出循环并跳到底部。