現在のアプリケーション - Breeze を使用した Angular アプリケーション。アプリケーションには、最大 7 つのエンティティ マネージャーとさまざまなデータ ドメイン (メタデータ) があります。アプリケーションが実行されると、次のようなエンティティ マネージャーをフェッチしようとします。
app.run(['$rootScope', 'datacontext1', ... ], function($rootScope, datacontext1, ...) {
datacontext1.loadMetadata();
...
datacontext7.loadMetadata();
}
すべての datacontext には独自のエンティティ マネージャーがあり、loadMetadata は次のとおりです。
function loadMetadata() {
manager.fetchMetadata().then(function(mdata) {
if (mdata === 'already fetched') {
return;
}
...
applyCustomMetadata(); // Do some custom job with metadata/entity types
});
}
メタデータはサーバーから非同期に取得されます。200Kb のような非常に大きなメタデータを持つモジュールはほとんどなく、エンティティ マネージャーへの読み込みと適用に時間がかかります。この loadMetadata 操作が完了する前に、同じエンティティ マネージャーで実行される最初の Breeze データ リクエストが開始される可能性があります。通常は問題ありません。Metadata エンドポイントはサーバーにキャッシュされますが、Breeze の非常に奇妙な動作が発生することがあります。
私が理解しているように、問題はBreezeの内部にあり、メタデータの約束を解決するために使用されるアプローチです(httpアダプターはシングルトンであり、2番目のリクエストは「すでにフェッチされた」文字列でメタデータをオーバーライドし、applyCustomMetadata()操作は実行されません)。
アプリケーションを大幅に変更せずに問題を解決する方法を見つける必要があります。
loadMetadata が完了する間、完全なアプリケーションがエンティティ マネージャーを使用するのを論理的に遅らせる必要があります。Breeze レベルで、メタデータの自動取得が既に進行中の場合に無効にする方法を探しています (ただし、要求を中断するのではなく、しばらく待ってから再試行してください)。他のアイデアでも構いません。