Возвращенный искаженный массив в угловой

#angular #typescript

Вопрос:

Привет, я новичок в angular и машинописи.

У меня проблема с возвращаемым массивом из метода. Вот что я сделал.

У меня была глобальная переменная:

     locations: string[] = [];
 

В Нгонините(),
Я вызову этот метод и введу некоторую строку внутри массива:

     this.getAllLocationWithinUserCountry();

    getAllLocationWithinUserCountry() {
      let location = localStorage.getItem('location');    
      location = JSON.parse(location).name;   
    
      this.memberListService.getLocationsFromAPI(location).subscribe((res: any) => {      
        for (let index in res.result) {      
           this.locations.push(res.result[index].location_name);       
        }
      });
    }
 

если я буду регистрировать местоположения, в консоли браузеров я увижу:

     []
      0: "USA"
      1: "Canada"
    length: 2
    [[Prototype]]: Array(0)
 

//извините, почему-то не удалось вставить мое изображение. поэтому я просто печатаю его.

Почему-то я не могу передать этот массив новому методу с параметром массива. См. ниже пример:

     getTransactions2(locations: string[]){
         console.log("location val====" locations);
    }
 

но если я создам новый массив, как показано ниже:

     let newlocation: string[] = ["USA","London"];
 

Я вижу, что он был принят. И это то, что я вижу в консоли браузера, если я регистрирую это новое местоположение:

     (2)['USA','London']
      0: "USA"
      1: "London"
    length: 2
    [[Prototype]]: Array(0)
 

//извините, почему-то не удалось вставить мое изображение. поэтому я просто печатаю его.

Если я попытаюсь выполнить цикл в этом.locations, кажется, что я не смогу выполнить цикл в этом массиве. См. пример:

     for (let index of this.locations) {
      console.log("===In loop==="); // no logs
      console.log("value===" index);// no logs
    }
 

Пожалуйста, помогите мне исправить массив или то, как я добавляю в него строку.
Не уверен, как исправить массив и успешно передать его методу.
ТИА.

Комментарии:

1. Когда ты звонишь getTransactions2 вскоре после this.getAllLocationWithinUserCountry(); такого звонка getTransactions2(this.locations) ?

2. @NavnathJadhav на самом деле, это то, что я сделал. Но, похоже, он не принимается в качестве параметра в getTransactions2(местоположения: строка[]). Не знаю, в чем дело. В отличие от того, когда я передал новое местоположение, оно, похоже, принимает его и может войти в систему.

3. Это связано с сетевым вызовом, сделанным this.memberListService.getLocationsFromAPI . im, работающим над этим.

Ответ №1:

Проблема getTransactions2 в том, что вам звонят до того, как вы получите ответ от своего вызова api this.memberListService.getLocationsFromAPI(location) , и это.location заполняется.

Вам нужно позвонить getTransactions2 после успешного вызова api.

Проверьте это решение.

   locations: string[] = [];

  ngOnInit(): void {
    this.getAllLocationWithinUserCountry()
      .pipe(tap(this.getTransactions2))
      .subscribe(locationNames => (this.locations = locationNames));
  }

  getAllLocationWithinUserCountry(): Observable<any> {
    const storageData = localStorage.getItem('location');
    const location = storageData ? JSON.parse(storageData).name : [];

    return this.memberListService.getLocationsFromAPI(location).pipe(
      pluck('result'),
      map((resultArray: any[]) => resultArray.map(item => item.location_name))
    );
  }

  getTransactions2(locations: string[]): void {
    console.log('location val====', locations);
  }
 

ДЕМОНСТРАЦИЯ

Комментарии:

1. Я попробовал это, и это работает! Большое вам спасибо за то, что помогли мне, и я узнал кое-что новое.

Ответ №2:

Попробуйте выполнить этот порядок выполнения:

 locations: string[] = [];

  ngOnInit() {

    this.getAllLocationWithinUserCountry();

    this.getTransactions2(this.locations);

    for (let index of this.locations) {
      console.log("===In loop===");
      console.log("value==="   index);
    }
  }

  getAllLocationWithinUserCountry() {
    let location = localStorage.getItem('location');
    location = JSON.parse(location).name;

    this.memberListService.getLocationsFromAPI(location).subscribe((res: any) => {
      for (let index in res.result) {
        this.locations.push(res.result[index].location_name);
      }
    });

  }

  getTransactions2(locations: string[]) {
    console.log("location val===="   locations);
  }
 

Комментарии:

1. Это больше похоже на то, что я сделал. Просто мой вопрос выше кода является неполным. Я попробовал это со своей стороны, я получаю пустое значение, когда регистрирую this.locations в ngOnInit() . Спасибо за попытку