0

How can i make the subscribe wait till my logic completes and transform returns the updated keys object ?

transform(value: any, args:string) : any {
    let keys = [];

    this.http.get('src/app/enum-data/enum.json').subscribe(data => {

      this.List = data;
      // Logic here (data vs value)
      for (var enumMember in value) {
        if (!isNaN(parseInt(enumMember, 10))) {
          keys.push({key: enumMember, value: value[enumMember]});
        } 
      }
    },
      err => {
        console.log(err);
      });

    return keys;

  }

HTML:

  <select>
          <option *ngFor="let item of gendersEnum | keys: 'gender'" [value]="item.key">{{item.value}}</option>
  </select>

This is a pipe module. Tried returning keys within the subscribe but still the same issue.

1
  • 1
    What does pipe module refer to in this context? Are you writing your own Angular pipe? angular.io/guide/pipes Commented Jul 22, 2019 at 7:25

2 Answers 2

5

Don't subscribe your Observable here. Just map the response with RxJs operators and subscribe when calling transform(...).

transform(value: any, args: string): Observable<any> {
        return this.http.get('src/app/enum-data/enum.json').pipe(
            map(data => {
                let keys = [];
                // Logic here (data vs value)
                for (const enumMember in value) {
                    if (!isNaN(parseInt(enumMember, 10))) {
                        keys.push({key: enumMember, value: value[enumMember]});
                    }
                }
                return keys;
            })
        );
    }

A better approach is to use async pipe to let angular subscribe and unsubscribe your observable :

 <select>
          <option *ngFor="let item of gendersEnum | keys: 'gender' | async" [value]="item.key">{{item.value}}</option>
  </select>
Sign up to request clarification or add additional context in comments.

4 Comments

updated the question where i'm using the pipe, how can i use the async pipe? just by adding async in the html?
In your component typescript you need to assign your observable to the class (with this) then in your template #ngFor="let item of (yourObservable | async)"
You can learn more here : blog.angularindepth.com/…
It gets me InvalidPipeArgument: '[object Object]' for pipe 'AsyncPipe' when tried to use the async pipe like this, *ngFor="let item of (gendersEnum | async) | keys: 'gender'"
0

Made some changes in method.

transform(value: any, args:string) : Observable<any>{
  return this.http.get('src/app/enum-data/enum.json').map(data => {
     let keys = [];
      this.List = data;
      // Logic here (data vs value)
      for (var enumMember in value) {
        if (!isNaN(parseInt(enumMember, 10))) {
          keys.push({key: enumMember, value: value[enumMember]});
        } 
      }
      return keys;
    },
      err => {
        console.log(err);
      });

  }```
Now you can subscribe Your translation method.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.