Javascript:从函数实现单一的退出点
我想知道是否有一个干净的方式来实现一个函数在JavaScript中的单一退出点。 在普通的C中,可以简单地使用goto
( Linux内核 – 示例源 )。
一见钟情,人们可以使用for, break and labels
和exceptions
。
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
退出循环,并跳转到底部。