.initialize
initialize
機能を使用すると、フックは非同期処理を行うか、他のフックに依存するスタートアップタスクを実行できます。すべてのSailsの設定は、フックのinitialize
関数が実行される前に完了することが保証されています。initialize
に配置したいタスクの例を以下に示します。
すべてのフック機能と同様に、initialize
はオプションであり、フック定義から省略できます。実装する場合、initialize
はasync function
である必要があり、Sailsのロードを完了するために解決する必要があります(つまり、エラーをスローしたり、永久にハングしたりすることはできません)。
initialize: async function() {
// Do some stuff here to initialize hook
}
デフォルトでは、フックはinitialize
関数の完了と解決に10秒の猶予があり、それを超えると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.config.installedHooks['sails-hook-foo'].name
がbar
に設定されている同じsails-hook-foo
フックは、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();
});
});
}