code: function (stepName/*, fn1, fn2, fn3, ... */) {
      var stepNameisFunction = typeof stepName === 'function';
      var step = stepNameisFunction ? 'default' : String(stepName);
      var fns = [].slice.call(arguments, stepNameisFunction ? 0 : 1);
      var flows = this.flows[step];
      var steps = this.steps;
  
      if (steps.indexOf(step) === -1) {
        steps.push(step);
      }
  
      if (!Array.isArray(flows)) {
        flows = this.flows[step] = [];
      }
  
      fns.forEach(function (fn) {
        typeof fn === 'function' && flows.push(fn);
      });
  
      return this;
    }
docs: 添加步骤以及对应的函数。
  如果指定的步骤已经存在，这些函数将会追加到这个步骤中。
  如果不存在，则新建一个新的步骤。
  
  这里添加的每一个函数在执行时都会接收到参数`(context, next, nextTo, data)`：
  
  * `context`：上下文对象。
  * `next(err[,data])`：执行步骤中的下一个函数，如果不调用，不会执行下一个函数。
  * `nextTo(step[,data])`：调用这个方法并传递步骤名称，可以跳转到对应的步骤。
  * `data`：调用`next(null, data)`中传入的数据。
  
  只有调用`next()`，才会继续执行步骤中的下一个函数。如果调用时，传入了非空的参数`err`，则后面的函数不再执行，使用`catch(fn)`设置的错误处理函数会被执行。
  如果调用`next()`/`nextTo()`时，传递了参数`data`，**下一个**函数会接收到这个数据。
  但是，下一个之后的的函数不会接收到这个数据，除非在下一个函数中再次调用`next()/nextTo()`时传递`data`。
  
  
  @param {String} [stepName='default'] 需要新建或者追加函数的步骤名称，如果省略这个参数，默认使用`default`
  @return {StepFlow}