使用while循环+打破一种可接受的方式来“转到”操作的结束?

时间:2015-04-05 00:20:35

标签: javascript design-patterns

我很难构建查询以找到答案 - 如果有人有任何输入或替代此方案,我感兴趣:

我正在连续对变量执行一系列操作。如果其中一个操作使变量满足某个条件,我想继续并跳过其余的操作。

我是怎么做到的:

while(true) {
  variable x;
  performOperation1(x);
  if( x meets conditions ) break;
  performOperation2(x);
  if( x meets conditions ) break;
  performOperation3(x);
  if( x meets conditions ) break;
  //...etc
}

我认为这个问题与语言无关,但我将其标记为JavaScript,因为这就是我现在面临的问题。

4 个答案:

答案 0 :(得分:1)

虽然你的问题与语言无关,但我猜测它的最佳答案却不是。例如,这是JS的一种可能性:

var x = init(), idx = -1; 
var ops = [performOperation1, performOperation2, performOperation3, ...];
while(x doesn't meet conditions && ++idx < ops.length) {
  ops[idx](x);
}

这似乎很好地满足了您最初的担忧,但不是comment您不想将这些计算抽象到自己的函数中。

另一种JS可能性,如果您愿意将此代码移动到它自己的函数中,那就是方法described by fbelanger

我建议您考虑的方法存在严重缺陷,主要是因为它滥用了while声明。 while被设计为循环机制。用它来模拟goto只是忽略了结构化编码的重点。

答案 1 :(得分:0)

这不行。当x满足任何条件时,你的循环应该导致错误。

function() {
    variable x;
    performOperation1();
    if( x meets conditions ) return x;
    performOperation2();
    if( x meets conditions ) return x;
    performOperation3();
    if( x meets conditions ) return x;
    //...etc
}

答案 2 :(得分:0)

也许使用Promises,您可以获得更清晰,更易读的代码:

performOperation1().then(performOperation2).then(performOperation3);

您的方法应该返回truefalse以打破链条。

此处有更多信息:https://www.promisejs.org/patterns/

答案 3 :(得分:0)

以下是我的写作方式:

variable x;
[ function() { performOperation1(x); },
  function() { performOperation2(x); },
  function() { performOperation3(x); }
].some(function(f) { f(); return x meets conditions; });