Javascript:从函数实现单一的退出点

我想知道是否有一个干净的方式来实现一个函数在JavaScript中的单一退出点。 在普通的C中,可以简单地使用goto ( Linux内核 – 示例源 )。

一见钟情,人们可以使用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; } } 

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

使用承诺。

就像是:

doSomething().then( function() { doSomethingElse().then( function(){ doYetAnotherThing() }) }); return 42;

在哪里doSomething,doSomethingElse和doYetAnotherThing表示可能“破坏”的单个步骤(现在break意味着“返回被标记为失败的promise”)。 他们每个人都应该回报一个承诺。 为了使代码更平坦,你可以select做promise-chaining( 这里有一个很好的video ,在Angular的上下文中,但你可以忽略这个部分)

我认为@Robert Levy有一个很好的观点。 处理单个出口点的好方法意味着承诺:

使用q从nodejs模块可以写:

 var Q = require('q'); Q.fcall(function(){ }) .then(function(){ }) .then(function(){ }) .catch(function(err){ //log them }) .done(function(){ do other stuff }) 

我想这个问题出现在一个大的函数中,你不想重复像释放资源那样的操作。

那么一个解决scheme可能是定义一个简单的函数:

 function yourFunction(){ var resource = thing(); function quit(){ resource.release(); } ... lot of code ... if (...) return quit(); ... } 

另一个解决scheme可能是把你的函数换成另一个:

 function bigFunWrapper(){ var resource = thing(); yourFunction(); resource.release(); } 

这个解决scheme,如果你不从多个地方调用它,可以改写为一个IIFE :

 (function(){ var resource = thing(); yourFunction(); resource.release(); })(); 

根据具体的使用情况,可能有更好的解决scheme。

现在,在回答这个问题之前,请让我明确地说:

我认为这是一个反模式! 不要使用,而是一个有趣的方法来解决你的问题。

 var returnCode = null; do { // Do calculation if (condition) break; // do calculation if (condition2) break; } while (false); return returnCode; 

说明: do...while循环必须至less运行一次。 false条件确保它只运行一次。 break退出循环,并跳转到底部。