Как последовательно запустить два вызова api в охраннике в angular 6?

  const data = {
    authToken: `Bearer ${this.authToken}`
  }
  this.appService.getEphemeralKey(data)
    .subscribe((response) => {
      if (response) {
        console.log(response);
        this.customerId = response.associated_objects[0].id;
       // this.retrieveCard();
      } else if (response.message === 'Unauthenticated') {
        localStorage.removeItem('userInfo');
        this.router.navigate(['/']);
        this.toastrService.info('Other user login with this account');
      }
      else {
        console.log(response.message);
      }
    }, error => {
      console.log('some error occured');
    })
}

retrieveCard () {

const data = {  
    authToken: `Bearer ${this.authToken}`,
    customerId: this.customerId
}
console.log(data);
this.appService.retrieveCard(data)
    .subscribe((response) => {
        if (response) {
             console.log(response.data);

            if(response.data.sources.data.length === 0){
                console.log("no card");
                this.subscribed=false;
            this.providerService.showSubscriptionButton();
            }else{
    console.log('yes card');
    this.subscribed=true;
        }

        } else if (response.message === 'Unauthenticated') {
            localStorage.removeItem('userInfo');
            this.router.navigate(['/']);
            this.toastrService.info('Other user login with this account');
        }
        else {
    console.log(response.message);
    this.subscribed=false;
        }
    }, error => {
  console.log('some error occured');
  this.subscribed=false;
    })

}

Я хочу, чтобы два соединяли эти вызовы в моем защитнике авторизации. Как я могу создать такую ​​защиту аутентификации, которая включает в себя два вызова api и возвращает true после того, как второй api возвращает true. Как сделать это Но он не работает для двух вызовов API. Мое решение таково

canActivate(route: ActivatedRouteSnapshot): Observable<boolean> {
    const data = {
      authToken: `Bearer ${this.authToken}`,
    }
    return this.appService.getEphemeralKey(data)
      .map((res) => {
        let customerId = res.associated_objects[0].id;
        let data1 = {
          authToken: `Bearer ${this.authToken}`,
          customerId: customerId
        }
        console.log(res)
        this.appService.retrieveCard(data1)
          .subscribe((res) => {
            console.log(res);
            if (res.data.sources.data.length === 0) {
              console.log("no card");
              this.subscribed = false;
              this.providerService.showSubscriptionButton();
            } else {
              console.log('yes card');
              this.subscribed = true;

            }
          })
        if (this.subscribed) {
          return true;
        }
        return false;
      })


  }

Пожалуйста, дайте мне знать, что я здесь делаю не так. я не получаю данные

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

Lokesh Saini 31.10.2018 14:25

Просто сделайте второй звонок внутри concatMap

martin 31.10.2018 14:28

Я не мог активировать функцию. это не работает для меня

Lokesh Saini 31.10.2018 14:33
1
3
281
1

Ответы 1

Вы должны использовать концепции Rxjs (map и flatMap) Вот официальная документация rxjs Официальные документы rxjs

Вот шаблон кода, который вы должны использовать.

код контроллера

Submit() {
this.doAPICall().subscribe(res => {
 // write your logic.
})

}

сервисный код

 public doAPICall() {
    this.getEphemeralKey.map(res => {
        return res;

    }).map(res1 => {
        this.retrieveCard.flatMap(res => {
            return Observable.of({
                res1: res1,
                res2: res
            });
        })
    })
}

    public getEphemeralKey(): Observable < any > {
        let data1 = {
            authToken: `Bearer ${this.authToken}`
        }
    return this.appService.getEphemeralKey(data1);
    }

    public retrieveCard(): Observable < any > {
        let  data2 = {
            authToken: `Bearer ${this.authToken}`,
            customerId: this.customerId
        }
    return this.appService.retrieveCard(data2);
    }

у меня это не сработало. Можете ли вы показать свой метод canactivate

Lokesh Saini 01.11.2018 11:32

Другие вопросы по теме