.initializeinitialize 功能允许一个钩子执行可能异步的或依赖于其他钩子的启动任务。在钩子的 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:loadednode_modules/sails-hook-foo 中的钩子默认情况下会发出 hook:foo:loadedsails-hook-foo 钩子,如果 sails.config.installedHooks['sails-hook-foo'].name 设置为 bar,将发出 hook:bar:loadednode_modules/mygreathook 中的钩子将发出 hook:mygreathook:loadedapi/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();
});
});
}