Многократный POST-запрос, без отправки любого, если один или другой отказывает - PullRequest
0 голосов
/ 26 апреля 2019

Итак, я хочу отправить 2 почтовых запроса вместе, но я хочу, чтобы в случае сбоя любого из 2 запросов (например, непредвиденная ошибка) ни один из запросов фактически не был выполнен.Предполагается, что запрос на 2 сообщения является отдельной функцией на бэкэнде (то есть: 2 отдельных конечных точки).

Я искал и нашел некоторые вопросы относительно похожими, но все решения не отменили бы оба запроса, если одинне удалось, и многие из них используют то, что кажется устаревшими функциями (mergeMap, forJoin, ...)

Попытка

Я пробовал несколько вариантов:

Карта запроса в другом запросе:

this.service.postFunction1(body1).pipe(
  map(()=>this.service.postFunction2(body2).subscribe(
    res=>{
      /** Stuff here... **/
    },
    err=>{
      /** Stuff here... **/   //Should I stop here the whole thing here?
    })
  )
).subscribe(
  res=>{
    /** Stuff here... **/
  },
  err=>{
    /** Stuff here... **/
  })
)

Вложенная подписка:

(я знаю, что это не очень хорошая практика)

this.service.postFunction1(body1).subscribe(
  res=>{
    this.service.postFunction2(body2).subscribe(
     res=>{},
     err=>{}
    )
  },
  err=>{
    /** Stuff here... **/   //Should I stop here the whole thing here?
  })
)

Прямо сейчас я называю их совершенно раздельно, потому что у меня нет четкого представления о том, как их собрать вместе, помня, что «если кто-то терпит неудачу, они оба терпят неудачу».

Может быть, я просто имеюмодифицировать бэкэнд и обрабатывать 2 почтовых запроса как одну функцию (1 конечная точка), но мне было любопытно, есть ли способ сделать это с отдельными запросами.

Ответы [ 2 ]

1 голос
/ 26 апреля 2019

Для этого вы можете использовать cancatMap () . Если вы можете расположить свои URL-адреса API в массиве и в последовательности, в которой вы хотите вызывать API-интерфейсы, то вы можете использовать что-то вроде:

// consider these as API urls
urls = ['url1', 'url2', 'url3']

from(this.urls).pipe(
  concatMap((eachUrl, index) => {
    if (index === 1) {
      return throwError('Error in Second') // simulated error thrown by second API call
    }
    // simulated API calls, you just need to return this, not the error simulation
    // return your API call here and that's all under your concatMap()
    return of(eachUrl).pipe(tap(_ => console.log('API url invoked -> ', eachUrl)))
  })
).subscribe((data) => {
  console.log(`data in subscribe `, data);
}, (err) => {
  console.log(`error in subscribe: `, err)
})

Вы увидите, что третий вызов API не сработает.

concatMap () будет ожидать завершения запроса до отправки следующего.

См. Пример здесь: https://stackblitz.com/edit/angular-qo1luf?file=src/app/app.component.ts

0 голосов
/ 26 апреля 2019

Что вы подразумеваете под?

ни один из запросов на самом деле не проходит

Бэкэнд уже получил эти запросы, обрабатывает их и отвечает. Их нельзя отменить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...