<Page>
  <h1>流程控制</h1>

  <p>流程控制信息分为三类:</p>

  <ul>
    <li>执行顺序控制类</li>
    <li>异步顺序控制类</li>
    <li>特殊控制类</li>
  </ul>

  <h2>执行顺序控制类</h2>

  <p>这一类非常简单，就是控制谁先执行谁后执行的，它不管执行内部例如`promise`、`setTimeout`之类异步操作，它只管开始执行的顺序。这一类总共有四个控制选项:
</p>

  <ul>
   <li> - first  : Bool</li>
    <li>- last   : Bool</li>
    <li>- before : String|Array</li>
    <li>- after  : String|Array</li>
  </ul>

  <p>before 和 after 需要传入的是目标监听器的名字，可以是一个字符串也可以是数组，数组代表同时保障在指定几个监听器的最前面或者后面。例如 Roof demo 中 security 模块的监听器指定了最先执行:</p>

  <Code type='javascript'>{`
  bus.on("todo.create", {
    "fn" : function guide( todo ){
      if( /drug/.test( todo.get("content"))){
        return this.error("你这有敏感词啊！")
      }
    },
    first : true
  })
  `}</Code>

  <h2>异步顺序控制类</h2>

  <ul>
    <li>waitFor  : String|Array</li>
    <li>blockFor : String|Array</li>
  </ul>

  <p>很多情况下监听器中会有异步操作。如果我们想要某个监听器在另一个监听器的异步操作执行完之后再执行。那么可以使用 `waitFor` 选项来实现，但是有个前提条件，即：有异步操作的监听器返回了一个 `promise`。例如。</p>

  <p>反过来，我们也可以主动的阻塞某个监听器的执行，例如上面的代码可以改写成:</p>

  <Code type='javascript'>{`
  bus.on("todo.create",{
    "fn" : function createTodo( todo ){
        //todo.push()返回的是一个promise
        //参考应用数据章节
        return todo.push()
    },
    "blockFor" : "todo.updateLocalTodos"
  })

  bus.on("todo.create",{
    "fn":function updateLocalTodos( todo){
      console.log("updating local todos")
      localTodos.insert( todo )
    }
  })
  `}</Code>

  <p>具体怎么使用应该与应用逻辑本身保持一致。</p>

  <h2>特殊控制类</h2>

  <p>这一类控制选项有两个：</p>

  <ul>
  <li>disable : String|Array</li>
  <li>mute    : String|Array</li>
  </ul>

  <p>第一个选项是用来禁用掉一个或多个监听器的。</p>
  <p>这两个控制选项都是为满足特殊业务需求而开放的，谨慎使用。</p>

  </Page>



