#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() . Спасибо за попытку