Я использую BreezeJS с Angular2 и заметил, что вызов MetaData вызывается несколько раз.Как предотвратить звонок BreezeJS MetaData, сделанный несколько раз
Я попытался настроить кеш, вызвав fetchMetadata() в конструкторе моего BreezeDataService, однако это не имеет никакого значения (он добавляет еще один вызов метаданных).
this.entityManager.fetchMetadata().then(function() { console.log('entityManager.fetchMetadata finished'); });
Я предполагаю, что это вызвано 5 запросов для данных делается при загрузке главной страницы и каждый из них уходит на извлечение метаданных, не дожидаясь существующего вызова метаданных для завершения.
Вы можете увидеть проблему на www.quemesa.com с инструментами СЕТЕЙ: (Первый 5 являются запросами Предполетного CORS)
Как я могу сказать код, чтобы ждать любого существующего вызова метаданных для завершения вместо извлечения его еще раз?
UPDATE с кодом:
@Injectable()
export class DataBreezeService {
public isSaving: boolean = false;
public entityManager: EntityManager;
constructor(private spinnerService: SpinnerService, private loggerService: LoggerService) {
this.entityManager = new EntityManager(environment.webApiServiceUrl);
this.entityManager.metadataStore.namingConvention = NamingConvention.camelCase;
this.entityManager.fetchMetadata().then(() => this.loggerService.info('entityManager.fetchMetadata finished'));
}
public executeQueryArray(query: EntityQuery) {
return this.entityManager.executeQuery(query)
.then((queryResult: QueryResult) => this.successArrayDataLoad(queryResult))
.catch((error) => this.errorDataLoad(error))
}
, а затем у меня есть различные службы сущностей, которые используют DataBreezeService:
@Injectable()
export class BookingService {
constructor(private dataBreezeService: DataBreezeService, private loggerService: LoggerService) {
}
public getBookingsForUser(userId: number, forceServerCall: boolean = false) {
this.dataBreezeService.initialiseQuery('getBookingsForUser', [userId], forceServerCall);
let query = new EntityQuery()
.from("bookings")
.where("createdByUserId", "==", userId)
.where("visibilityId", "==", Status.Active) //booking is active
.toType('Booking')
.expand('createdByUser, restaurant, restaurant.suburb, restaurantScheduleDiscount, rating')
.orderBy("bookingDate Desc")
.inlineCount(); //return total
return this.dataBreezeService.executeQueryArray(query);
}
Hi Ward, да, я пользовался услугами передачи данных. Я добавил еще несколько кодов. Я думаю, что часть, которая не работает (и что я не понимаю), - это предложение «Предполагая, что вы следуете этому совету, вы можете получать метаданные на этапе инициализации, придерживаться обещания и связывать все последующие вызовы с помощью этого разрешения обещаю «. В DataBreezeService я объявляю entityManager: EntityManager - как я могу рассказать обо всех вызовах, которые используют его для WAIT, пока не завершится первый вызов MetaData? – Rodney