Передайте наблюдаемый ответ следующему наблюдаемому после фильтрации - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь получить ответ от одной наблюдаемой, отфильтровать его и использовать это значение в следующем вызове функции.

Это мои 3 функции:

initTicket(options : ticket = {}, include_client : boolean ) {
    let employee = this.global.getEmployee()
    let submitter_id = null
    let options = {}

    return this.getUsers().subscribe(
      success => {
        let user = _.find(success['users'], { 'email': employee.email })
        submitter_id = user.id
        options.submitter_id = submitter_id

        this.createTicket(options)
      },
      err => {
        this.global.handleResponse(err.error, true)
      }
    )
  }

  getUsers() {
    let headers = this.setOptions()
    let org_id =  ORG_ID;
    let url = `${this.baseUrl}/organizations/${org_id}/users.json`

    return this.http.get(url, {headers: headers})
  }

  createTicket( options : ticket = {} ) {
    let headers = this.setOptions()

    let data = {
      "ticket": {
        "subject": options.subject,
        "comment": {
          "body": options.comment
        },
        "priority": options.priority,
        "group_id": options.group_id,
        "type": options.type,
        "tags": ['app'],
        "external_id": options.external_id,
        "submitter_id": 367510232431
      }
    }

    return this.http.post(`${ this.baseUrl }/tickets.json`, JSON.stringify(data), { headers: headers })
  }

Этоправильный способ связать 2 наблюдаемые или я должен использовать функцию, отличную от subscribe()?

1 Ответ

0 голосов
/ 17 октября 2018

Я бы использовал switchMap и tap:

return this.getUsers()
.pipe(
  tap((res) => {

    let user = _.find(res['users'], { 'email': employee.email })
        submitter_id = user.id
        options.submitter_id = submitter_id
  }),
  switchMap(() => this.createTicket(options))
)
.subscribe(...

В основном tap работает в случае успеха и switchMap подпишется на ваш другой http вызов.

Или, если вы не используете последнюю версию RXJS:

return this.getUsers()
.do((res) => {

  let user = _.find(res['users'], { 'email': employee.email })
      submitter_id = user.id
      options.submitter_id = submitter_id
})
.switchMap(() => this.createTicket(options))
.subscribe(...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...