Текущее приложение - Angular приложение с Breeze. Приложение имеет ~ 7 менеджеров сущностей и разные домены данных (метаданные). Когда приложение запускается, мы пытаемся получить менеджеры сущностей, например:
app.run(['$rootScope', 'datacontext1', ... ], function($rootScope, datacontext1, ...) {
datacontext1.loadMetadata();
...
datacontext7.loadMetadata();
}
У каждого контекста данных есть собственный менеджер сущностей, а loadMetadata:
function loadMetadata() {
manager.fetchMetadata().then(function(mdata) {
if (mdata === 'already fetched') {
return;
}
...
applyCustomMetadata(); // Do some custom job with metadata/entity types
});
}
Метаданные поступают с сервера асинхронно. Немногие модули имеют действительно большие метаданные, например 200 КБ, и им требуется некоторое время для загрузки и применения к диспетчеру сущностей. Вполне возможно, что первый запрос данных Breeze, выполненный в том же диспетчере сущностей, будет запущен до завершения этой операции loadMetadata, и, как я понимаю, Breeze снова автоматически получит метаданные. Обычно это не проблема, конечная точка метаданных кэшируется на сервере, но иногда это приводит к очень странному поведению Breeze - EntityManager.fetchMetadata resolve обещание как «уже получено», и в этом случае операция applyCustomMetadata () не может быть выполнена.
Насколько я понимаю, проблема находится внутри Breeze, и подход к нему используется для разрешения обещания метаданных (похоже, что http-адаптер является одноэлементным, и второй запрос переопределяет метаданные с «уже полученной» строкой, а операция applyCustomMetadata () никогда не выполняется).
Необходимо найти способ решить проблему без существенных изменений в приложении.
Логически необходимо отложить полное приложение от использования менеджеров сущностей во время выполнения loadMetadata. Ищете способ на уровне Breeze отключить автоматическую выборку метаданных, если он уже выполняется (но не прерывание запроса, просто подождите и повторите попытку через некоторое время). Любые другие идеи тоже подойдут.