Search code examples
angularangular-http

How to I make sure a certain function gets executed after another in Angular?


I am currently trying to implement a membership portal in which when I submit a form, I want to post the member and immediately retrieve the value of the member from the ID number that is entered.

My submit function is as follows:

submitForm() {
    const data = this.memberForm.value;
    console.log(data);
    this.service.postNewMember(data.title, data.firstname, data.surname, data.telRes, data.faxNbr, data.email, data.idNbr);
      
    this.service.getMember(data.idNbr).subscribe((res: any) => {
        console.log(res);
    }, (err: any) => {
        console.log(err);
    });
}

The two functions in my service are given below:

getMember(idNbr: string) {
    return this.http.get(this.url + '/crm/getMember/'+ idNbr)
}

postNewMember(title: string, firstName: string, surName: string, telRes: string, faxNbr: string, email: string, idNbr: string) {
    const headers = new HttpHeaders().set('Content-Type', 'application/json');

    const newMember = {
      title: title,
      firstName: firstName,
      surName: surName,
      telRes: telRes,
      faxNbr: faxNbr,
      email: email,
      idNbr: idNbr
    }

    this.http.post(this.url + '/crm/postNewMember', JSON.stringify(newMember), { headers: headers }).subscribe((res: any) => {
      console.log(res);
    })
    
}

I have tested both the service calls separately and they each work well, but what tends to happen is that the get method get's called before the post method has finished execution, and hence I get an error logged in my console, while having the data inserted as needed. However I need the get method data to perform further operations on it, hence I need it to be executed after the post method.

How do I ensure the service.getMember() gets executed after the service.postNewMember()?


Solution

  • First let your postNewMember to return an observable

    getMember(idNbr: string) {
        return this.http.get(this.url + '/crm/getMember/'+ idNbr)
    }
    
    postNewMember(title: string, firstName: string, surName: string, telRes: string, faxNbr: string, email: string, idNbr: string) {
        const headers = new HttpHeaders().set('Content-Type', 'application/json');
    
        const newMember = {
          title: title,
          firstName: firstName,
          surName: surName,
          telRes: telRes,
          faxNbr: faxNbr,
          email: email,
          idNbr: idNbr
        }
    
        return this.http.post(this.url + '/crm/postNewMember', JSON.stringify(newMember), { headers: headers });        
    }
    

    Then when you call it use subscribe to call also getMember

        submitForm() {
            const data = this.memberForm.value;
            console.log(data);
            this.service.postNewMember(data.title, data.firstname, data.surname, data.telRes, data.faxNbr, data.email, data.idNbr).subscribe( (res) => {
    
          this.service.getMember(data.idNbr).subscribe((res2: any) => {
                console.log(res2);
            }, (err: any) => {
                console.log(err);
            });
     });
        }