.initializeinitialize機能を使用すると、フックは非同期処理を行うか、他のフックに依存するスタートアップタスクを実行できます。すべての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();
});
});
}