.initialize
initialize
功能允许一个钩子执行可能异步的或依赖于其他钩子的启动任务。在钩子的 initialize
函数运行之前,保证所有 Sails 配置都已完成。您可能希望在 initialize
中执行的任务示例包括
与所有钩子功能一样,initialize
是可选的,可以从钩子定义中省略。如果实现,initialize
应该是一个 async function
,它必须被解析(即,不能抛出异常或永远挂起),以便 Sails 完成加载
initialize: async function() {
// Do some stuff here to initialize hook
}
默认情况下,钩子有十秒钟的时间来完成它们的 initialize
函数并解析,然后 Sails 才会抛出错误。可以通过将 _hookTimeout
键设置为 Sails 应该等待的毫秒数来配置该超时。这可以在钩子的 defaults
中完成
defaults: {
__configKey__: {
_hookTimeout: 20000 // wait 20 seconds before timing out
}
}
当一个钩子成功初始化时,它会发出一个具有以下名称的事件
hook:<钩子名称>:loaded
例如
orm
钩子在它的初始化完成之后发出 hook:orm:loaded
node_modules/sails-hook-foo
中的钩子默认情况下会发出 hook:foo:loaded
sails-hook-foo
钩子,如果 sails.config.installedHooks['sails-hook-foo'].name
设置为 bar
,将发出 hook:bar:loaded
node_modules/mygreathook
中的钩子将发出 hook:mygreathook:loaded
api/hooks/mygreathook
中的钩子也将发出 hook:mygreathook:loaded
您可以使用“钩子加载”事件来使一个钩子依赖于另一个钩子。要做到这一点,只需将您的钩子的 initialize
逻辑包装在一个对 sails.on()
的调用中。例如,要使您的钩子等待 orm
钩子加载,您可以使您的 initialize
类似于以下代码
initialize: async function() {
return new Promise((resolve)=>{
sails.on('hook:orm:loaded', ()=>{
// Finish initializing custom hook
// Then resolve.
resolve();
});
});
}
要使一个钩子依赖于多个其他钩子,请将要等待的事件名称收集到一个数组中,并调用 sails.after
initialize: async function() {
return new Promise((resolve)=>{
var eventsToWaitFor = ['hook:orm:loaded', 'hook:mygreathook:loaded'];
sails.after(eventsToWaitFor, ()=>{
resolve();
});
});
}