.initialize
initialize
功能讓 Hook 執行啟動任務,這些任務可能是非同步的,或依賴其他 Hook。保證在 Hook 的 initialize
函數運行之前,所有 Sails 配置都已完成。您可能希望在 initialize
中放入的任務範例包括
與所有 Hook 功能一樣,initialize
是選用的,可以從您的 Hook 定義中省略。如果實作了,initialize
應該是一個 async function
,必須解析(即不拋出錯誤或永遠掛起),Sails 才能完成載入
initialize: async function() {
// Do some stuff here to initialize hook
}
預設情況下,Hook 有十秒鐘的時間完成其 initialize
函數並解析,然後 Sails 拋出錯誤。可以透過將 _hookTimeout
鍵設定為 Sails 應等待的毫秒數來配置該超時時間。這可以在 Hook 的 defaults
中完成
defaults: {
__configKey__: {
_hookTimeout: 20000 // wait 20 seconds before timing out
}
}
當 Hook 成功初始化時,它會發出一個具有以下名稱的事件
hook:<hook name>:loaded
例如
orm
Hook 在其初始化完成後發出 hook:orm:loaded
node_modules/sails-hook-foo
中的 Hook 預設發出 hook:foo:loaded
sails-hook-foo
Hook,將 sails.config.installedHooks['sails-hook-foo'].name
設定為 bar
將發出 hook:bar:loaded
node_modules/mygreathook
中的 Hook 將發出 hook:mygreathook:loaded
api/hooks/mygreathook
中的 Hook 也會發出 hook:mygreathook:loaded
您可以使用「hook loaded」事件使一個 Hook 依賴於另一個 Hook。為此,只需將 Hook 的 initialize
邏輯包裝在對 sails.on()
的呼叫中。例如,要使您的 Hook 等待 orm
Hook 載入,您可以使您的 initialize
類似於以下內容
initialize: async function() {
return new Promise((resolve)=>{
sails.on('hook:orm:loaded', ()=>{
// Finish initializing custom hook
// Then resolve.
resolve();
});
});
}
要使 Hook 依賴於其他幾個 Hook,請將要等待的事件名稱收集到一個陣列中,然後呼叫 sails.after
initialize: async function() {
return new Promise((resolve)=>{
var eventsToWaitFor = ['hook:orm:loaded', 'hook:mygreathook:loaded'];
sails.after(eventsToWaitFor, ()=>{
resolve();
});
});
}