【问题标题】:breaking out of a switch within a foreach loop closure在 foreach 循环闭包中断开开关
【发布时间】:2014-11-24 17:23:44
【问题描述】:

我有以下代码

 void onSelectionChangedFiredSources( Event event, var detail,
                                SelectCheckboxMenuComponent target)
  {
    // getItemModels returns a list of objects
      getItemModels( target.selectedItems )
        ..forEach( (item)
          {          
             switch( item.label )
             {
               case 'Ear':
                 toggleDialog( 'paper-dialog-transition-center',
                                $['ear-side-dialog']);
                 break;

               case 'Eye':
                 toggleDialog( 'paper-dialog-transition-center',
                                $['eye-side-dialog']);
                 break;

               case 'Nostril':
                 toggleDialog( 'paper-dialog-transition-center',
                                $['nostril-side-dialog']);
                 break;

               case 'Thorax':
                 toggleDialog( 'paper-dialog-transition-center',
                                $['thorax-side-dialog']);
                 break;

               default:
                 srcDataMap.add( item.label, item.selected);
             }   
          });
  }

当一个案例被触发时,我想跳出foreach循环。

请注意,每次选择更改时,所有选择都由 target.selectedItems 表达式返回。因此,如果“耳朵”是第一个选择,则执行循环,然后选择“眼睛”时,列表返回将同时具有耳朵和眼睛。 这怎么做最好? 谢谢

【问题讨论】:

  • 你能解释一下你试图完成什么(除了结束forEach,据我所知这是不可能的?
  • 请点击link,然后点击电影按钮。好家伙和教父被检查了。 getItemModels(target.selectedItems) 将返回复选框的两个标签。在我的情况下,当我单击“好家伙”时,会切换一个对话框,让我使用与“电影”类似的组件进行另一个选择。一旦做出第二个选择,我想完全脱离循环,而不触发选中的“教父”框,该框也会触发一个对话框。
  • 恐怕我无法理解这个描述。如果你显示一个对话框并等待用户输入,那么你一定已经跳出了你所处的任何循环。Dart 是单线程的,所以如果你还在循环中,浏览器的 UI 线程将无法显示任何对话框。即,“一旦做出第二次选择”就为时已晚,无法摆脱任何东西。

标签: dart dart-polymer


【解决方案1】:

您不能中断forEach 呼叫。

您不能使用break,因为它不是循环。这是一个函数调用,break只在当前函数内部起作用。

你不能return,因为那只会继续下一个元素。

可以throw结束forEach,但这并不漂亮。

您可以做的是根本不使用forEach,而是使用for-in 循环,然后使用带标签的中断break

void onSelectionChangedFiredSources(Event event, var detail,
                                    SelectCheckboxMenuComponent target) {
  // getItemModels returns a list of objects
  var models = getItemModels(target.selectedItems);
  loop: for (var item in models) {
    switch (item.label) {
      case 'Ear':
      case 'Eye':
      case 'Nostril':
      case 'Thorax':
        toggleDialog('paper-dialog-transition-center',
                     $['${item.label.toLowerCase()}-side-dialog']);
        break loop;
      default:
        srcDataMap.add( item.label, item.selected);
    }   
  }
}

您需要使用带标签的break,因为没有标签只会破坏switch 语句。

【讨论】:

  • 感谢您的帮助。您的解决方案的问题是每种情况的失败。在我的情况下,一旦每个案例都被执行,循环必须退出,因为这是我需要执行的唯一案例,直到我做出另一个选择。上述情况不会做到这一点。
  • 哪个失败了?唯一的失败是在默认情况下,所有其他情况都会打破循环。您的原始代码也没有在默认情况下中断。
  • 在所有 case 都执行完之后才会中断。因此,如果选择了耳朵和眼睛,对话框将被触发两次,每次触发一次,然后循环中断。对于我的用例,循环必须在每个案例之后中断。
  • 这段代码在第一次匹配 "Ear"、"Eye" 等之后就中断了循环。你能准确描述一下你想要它做什么吗?我不清楚“在每个案例之后打破循环”是什么意思,因为打破循环意味着没有更多案例被执行。
猜你喜欢
  • 1970-01-01
  • 2015-09-13
  • 2012-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多