У меня есть приложение (серверная часть Asp.Net Core 2.1, Angular 5 front-end), размещенное на AWS.Чтобы создать объект, содержащий информацию об учетной записи пользователя, я делаю несколько запросов Http для получения информации об учетной записи.Однако во многих случаях приложение зависает при попытке выполнить запросы этой серии.Я пробовал разные способы объединения запросов, и все они имеют одну и ту же проблему (с различной частотой сбоев), но все они вызывают у меня одну и ту же проблему.Я пробовал combineLatest
, Observable.joinFork
и цепочки подписок.Последний вариант действительно ужасен, но, похоже, он выдает ошибку реже, чем другие два метода.
Ниже приведены примеры всех трех из этих методов, а также два скриншота, на которых показано, как выглядит цепочка запросов.например, когда он работает хорошо, а когда он терпит неудачу.
Я не чувствую, что это чрезмерное количество запросов ... но я, очевидно, делаю что-то не так.Любые идеи?
Следует отметить, что у меня нет этой проблемы, когда я публикую локально или запускаю приложение в VS.Это происходит только после публикации в облаке.Я не вижу ошибок в журнале моего сервера.
ОбъединитьПоследние
const filterParams = { accountId: account.id };
return combineLatest(
this.getAccount(account.id),
this.adfiService.listAdfis(filterParams),
this.feedService.listFeeds(filterParams),
this.feedGroupService.listFeedGroups(filterParams),
this.feedGroupService.listLivestocks(filterParams),
this.farmService.listFarms(filterParams),
this.gatewayService.listGateways(filterParams),
this.barnService.listBarns(filterParams),
this.binService.listBins(filterParams),
this.sensorService.listSensors(filterParams),
this.definitionService.listDefinitions(filterParams),
this.userService.listUsers(filterParams)
).map(([res1, res2, res3, res4, res5, res6, res7, res8, res9, res10, res11, res12]) => {
this.accountObservable = {
account: res1 as Account,
adfis: res2 as Adfi[],
feeds: res3 as Feed[],
feedGroups: res4 as FeedGroup[],
livestocks: res5 as Livestock[],
farms: res6 as Farm[],
gateways: res7 as Gateway[],
barns: res8 as Barn[],
bins: res9 as Bin[],
sensors: res10 as Sensor[],
definitions: res11 as Definition[],
users: res12 as User[]
} as AccountObservable;
return this.setVariables(this.accountObservable);
});
Observable.forkJoin
const filterParams = { accountId: account.id };
return Observable.forkJoin(
this.getAccount(account.id).map(res => res),
this.adfiService.listAdfis(filterParams).map(res => res),
this.feedService.listFeeds(filterParams).map(res => res),
this.feedGroupService.listFeedGroups(filterParams).map(res => res),
this.feedGroupService.listLivestocks(filterParams).map(res => res),
this.farmService.listFarms(filterParams).map(res => res),
this.gatewayService.listGateways(filterParams).map(res => res),
this.barnService.listBarns(filterParams).map(res => res),
this.binService.listBins(filterParams).map(res => res),
this.sensorService.listSensors(filterParams).map(res => res),
this.definitionService.listDefinitions(filterParams).map(res => res),
this.userService.listUsers(filterParams).map(res => res)
).map(res => {
this.Observable.forkJoin = {
account: res[0] as Account,
adfis: res[1] as Adfi[],
feeds: res[2] as Feed[],
feedGroups: res[3] as FeedGroup[],
livestocks: res[4] as Livestock[],
farms: res[5] as Farm[],
gateways: res[6] as Gateway[],
barns: res[7] as Barn[],
bins: res[8] as Bin[],
sensors: res[9] as Sensor[],
definitions: res[10] as Definition[],
users: res[11] as User[]
} as AccountObservable;
return this.setVariables(this.accountObservable);
});
Цепные подписки
const filterParams = { accountId: this.selectedAccount.id };
return this.getAccount(this.selectedAccount.id).map(
(res: Account) => {
this.selectedAccount = res;
this.accountObservable.account = res;
this.adfiService.listAdfis(filterParams).subscribe(
(res: Adfi[]) => { this.accountObservable.adfis = res },
() => {},
() => {
this.accountLoadingStatus.emit("adfis (5%)");
this.feedGroupService.listLivestocks(filterParams).subscribe(
(res: Livestock[]) => { this.accountObservable.livestocks = res },
() => {},
() => {
this.accountLoadingStatus.emit("livestocks (10%)");
this.feedService.listFeeds(filterParams).subscribe(
(res: Feed[]) => { this.accountObservable.feeds = res },
() => { },
() => {
this.accountLoadingStatus.emit("feeds (20%)");
this.feedGroupService.listFeedGroups(filterParams).subscribe(
(res: FeedGroup[]) => { this.accountObservable.feedGroups = res },
() => { },
() => {
this.accountLoadingStatus.emit("feed groups (30%)");
this.farmService.listFarms(filterParams).subscribe(
(res: Farm[]) => { this.accountObservable.farms = res },
() => { },
() => {
this.accountLoadingStatus.emit("farms (35%)");
this.gatewayService.listGateways(filterParams).subscribe(
(res: Gateway[]) => { this.accountObservable.gateways = res },
() => { },
() => {
this.accountLoadingStatus.emit("gateways (40%)");
this.barnService.listBarns(filterParams).subscribe(
(res: Barn[]) => { this.accountObservable.barns = res },
() => { },
() => {
this.accountLoadingStatus.emit("barns (50%)");
this.binService.listBins(filterParams).subscribe(
(res: Bin[]) => { this.accountObservable.bins = res },
() => { },
() => {
this.accountLoadingStatus.emit("bins (60%)");
this.sensorService.listSensors(filterParams).subscribe(
(res: Sensor[]) => { this.accountObservable.sensors = res },
() => { },
() => {
this.accountLoadingStatus.emit("sensors (70%)");
this.definitionService.listDefinitions(filterParams).subscribe(
(res: Definition[]) => { this.accountObservable.definitions = res },
() => { },
() => {
this.accountLoadingStatus.emit("reading types (80%)");
this.userService.listUsers(filterParams).subscribe(
(res: User[]) => { this.accountObservable.users = res },
() => { },
() => {
this.accountLoadingStatus.emit("users (90%)");
return this.setVariables(this.accountObservable);
});});});});});});});});});});});});
Успешный запрос
Неудачный запрос
Все запросы после зависшего отменяются.