initialize(cb)

initialize特性允许一个钩子去执行那些也许依赖于钩子或异步的启动任务。所有的Sails配置都保证在一个钩子的initialize函数运行之前完成。你也许会放在initialize中的任务例子是:

  • 登录到一个远程的API
  • 从一个会被钩子方法使用的数据库读取数据
  • 从一个用户配置的目录中加载支持文件
  • 等待其他的钩子首先去加载

就像所有钩子的特性,initialize是可选地并且可以不计入你的钩子定义中。如果实现了,initialize会携带一个参数:一个回调函数,在Sails结束加载的时候会去调用它:

initialize: function(cb) {

   // Do some stuff here to initialize hook
   // And then call `cb` to continue
   return cb();

}
钩子超时设置

默认,钩子有10秒的时间去完成initialize函数并在Sails抛出一个错误之前调用cb。这个超时时间可以通过设置_hookTimeout关键词来设置,超时时间的单位是毫秒。这个是在钩子的defaults中设置:

defaults: {
   __configKey__: {
      _hookTimeout: 20000 // wait 20 seconds before timing out
   }
}
钩子事件和依赖

当一个钩子成功地初始化知乎,它会发射一个下面名字的事件:

hook:<hook name>:loaded

比如:

  • orm内核钩子发射hook:orm:loaded在它的初始化结束之后
  • 安装在node_modules/sails-hook-foo的钩子默认会发射hook:foo:loaded事件。
  • 相同的sails-hook-foo钩子,但是设置sails.config.installedHooks['sails-hook-foo'].namebar的话会发射hook:bar:loaded事件
  • 安装在node_modules/mygreathook的钩子会发射hook:mygreathook:loaded事件
  • 安装在api/hooks/mygreathook的钩子会发射hook:mygreathook:loaded事件

你可以使用"hook loaded“事件来让一个钩子依赖于另一个钩子。为了这样做,你可以简单地将sails.on()的调用封装到你的钩子的initialize逻辑。比如,为了让你的钩子等待钩子orm钩子加载,你可以让你的initialize函数写成这样:

initialize: function(cb) {

   sails.on('hook:orm:loaded', function() {

      // Finish initializing custom hook
      // Then call cb()
      return cb();

   }
}

为了让你的钩子依赖于多个钩子,你可以将所有需要等待的时间组成一个数组并调用sails.after

initialize: function(cb) {

   var eventsToWaitFor = ['hook:orm:loaded', 'hook:mygreathook:loaded'];
   sails.after(eventsToWaitFor, function() {

      // Finish initializing custom hook
      // Then call cb()
      return cb();

   }
}

results matching ""

    No results matching ""